La limite inférieure de l'efficacité est O(n) - il faut au moins lire tous les éléments. Il existe donc plusieurs approches :
L'approche la plus simple et la plus stupide
Recherche de chaque élément du tableau 1 dans le tableau 2. Complexité en temps O(n^2).
Approche du tri
Vous devez trier uniquement le tableau 1, puis rechercher les éléments du tableau 2 en utilisant la recherche binaire. Complexité en temps : tri O(nlogn), recherche O(n * logn) = O(nlogn), total O(nlogn).
Approche par hachage
Créer une table de hachage à partir d'un tableau de un éléments. Recherchez les éléments du deuxième tableau dans la table de hachage. La complexité temporelle dépend de la fonction de hachage. Vous pouvez obtenir O(1) pour les recherches dans le cas optimal (tous les éléments auront une valeur de hachage différente), mais O(n) dans le pire des cas (tous les éléments auront la même valeur de hachage). Complexité totale en temps : O(n^x), où x est un facteur d'efficacité de la fonction de hachage (entre 1 et 2).
Certaines fonctions de hachage sont garanties pour construire une table sans collisions. Mais la construction ne prend plus strictement O(1) temps pour chaque élément. Elle sera O(1) dans la plupart des cas, mais si la table est pleine ou si une collision est rencontrée, alors la table doit être réorganisée - ce qui prend O(n) temps. Cela n'arrive pas si souvent, beaucoup moins fréquemment que les ajouts propres. Ainsi, la complexité temporelle AMORTISSÉE est de O(1). Nous ne nous soucions pas du fait que certains ajouts prennent O(n) de temps, tant que la majorité des ajouts prend O(1) de temps.
Mais même ainsi, dans un cas extrême, la table doit être remaniée à chaque insertion, donc la complexité temporelle stricte serait O(n^2).
23 votes
Triez d'abord les tableaux. Vous n'aurez alors besoin que d'une seule passe.
0 votes
Comme indiqué ci-dessus, triez les deux tableaux, et à partir de là, c'est vraiment facile.
0 votes
Considérons que le tri ne peut pas être mis en œuvre dans ce cas (je dis cela parce que dans la plupart des cas quotidiens, il faudra plus de temps pour trier les types de données non primitifs ou les classes, ce qui supprimerait l'objectif de la passe unique).
51 votes
Utilisez HashSet pour stocker toutes les données du premier tableau. Ensuite, pour chaque élément du second tableau, vérifiez si le HashSet contient() l'élément. La complexité du tri est O(n lg n) alors que la complexité de cette méthode est O(n).
0 votes
Le tri est il autorisé, ou devez vous travailler le tableau tel qu'il est ? parce que cela ressemble à une question sur les algorithmes de recherche de chaînes de caractères.
0 votes
Eh bien, je suppose que le triage consiste à faire plusieurs passages sur le tableau, donc pour moi cette option devrait être exclue.
4 votes
Qu'est-ce qui est le plus important pour vous ? L'efficacité du temps ou de l'espace ?
0 votes
@RanjanSarma Trier, puis fusionner c'est
O(n lg n)
. L'utilisation de tableaux non triés estO(n^2)
. Le triage sera beaucoup plus efficace.1 votes
Le type des tableaux est-il réellement
char
? Certains des arguments avancés dans les commentaires ci-dessous pourraient être résolus en imposant certaines restrictions aux types. Par exemple, tout ce qui concerne les types attendusO(N)
avec les tables de hachage s'envole si vous ne disposez pas d'une fonction de hachage raisonnable pour le type (c'est pourquoi Java vous encourage à en écrire une). Inversement, avecchar
et une entrée suffisamment grande, le plus rapide pourrait être de créer un tableau avec un élément pour chaque valeur de caractère (généralement 256 ou 65536), et de l'utiliser pour enregistrer les caractères qui apparaissent dans chaque entrée.0 votes
Duplicata possible de Algorithme efficace d'intersection d'ensembles
0 votes
Les doublons vous intéressent-ils ? Par exemple, si A : [1,1,2] et B : [1,2], l'intersection doit-elle être [1] ?
25 votes
Sans définition claire de ce qu'est le "meilleur", je propose cette solution pour trier les tableaux : Imprimez chaque élément du tableau sur une feuille de papier, et placez chaque feuille de papier dans une enveloppe clairement identifiée. Envoyez les enveloppes à votre grand-mère en lui demandant de ne lui renvoyer que les articles qui se trouvent dans les deux enveloppes, ainsi que des biscuits. La solution n'est pas très rapide car il s'agit de
O(USPS^grandmother)
mais c'est mieux parce que les cookies sont géniaux.0 votes
Je suppose que je ne comprends pas pourquoi vous hacherez ET trierez ? Votre hachage n'est pas garanti être O(n) et le tri peut ne pas être O(n log(n)) où n est le nombre d'éléments. Si vous n'êtes pas autorisé à créer d'autres types de données et que vous ne pouvez que comparer, vous devrez trouver la méthode de comparaison de chaînes de caractères la plus efficace et éventuellement utiliser des astuces comme certaines personnes l'ont suggéré. Si vous n'êtes pas limité dans la création de données supplémentaires, votre meilleure option est un hachage. Un arbre binaire de quelque sorte pourrait être un autre moyen de le faire.
0 votes
@user1700184 de quoi parlez-vous ? En quoi l'interrogation d'un HashSet est-elle O(1) ?