Le calcul de définir l'intersection, dans le temps linéaire?
Est-il un algorithme qui, étant donnés deux ensembles, calcule leur intersection dans le temps linéaire?
Je peux courir deux for
boucles de vérifier toutes les paires d'éléments, les éléments de l'enregistrement que je trouve dans les deux ensembles. Cependant, la runninng temps O(n2). Comment dois-je faire en O(n) le temps?
- POURQUOI serait-il jamais être n^2? N'est pas "évident" solution en O(n), et nous devrions être en train d'essayer de trouver une meilleure?
Vous devez vous connecter pour publier un commentaire.
Qui dépend de votre mise en œuvre.
Si vous avez une table de hachage set (O(1) recherche), alors l'approche indiquée par tous les autres affiches est correct. Itérer sur tous les éléments dans le premier set. Si c'est dans le deuxième set, puis l'ajouter à la suite. Cela s'exécute en O(n) fois.
Si vous avez un arbre de jeu (O(lg n) de recherche), alors cette approche fonctionne, mais il s'exécute en temps O(n lg n) fois. Vous pouvez faire mieux; il y a un O(n) solution. Je suppose que vous avez une sorte de itérateur qui peut traverser les éléments des deux ensembles dans l'ordre croissant. Si vous le faites, alors la question est "donné deux listes dans l'ordre de tri, de trouver leur point d'intersection." Cela peut être fait en utilisant une version modifiée de l'algorithme que vous utilisez pour fusionner les deux chaînes de montagnes. L'idée est de garder la trace des deux itérateurs. À chaque étape, de comparer les premiers éléments de l'plages. Si elles sont égales, ajouter l'élément à l'intersection et de faire progresser à la fois les itérateurs de l'avant. Si le premier est inférieur au second, puis avancer la première itérateur. Si le premier élément est plus grand, puis l'avance, la deuxième itérateur. Cela s'exécute en temps O(n) car chaque itération consomme au moins un élément, et il y a seulement O(n) éléments au total.
Je me demande personne n'a mentionné de table de hachage.
Quel que soit votre jeu de mise en œuvre (même si 'set' signifie ici un tableau simple), vous pouvez
O(n)
Si le
contains
test est la constante de temps (comme dans un jeu qui utilise une table de hachage comme une mise en œuvre), alors cet algorithme estO(n)
.Combiner les deux tableaux, et de compter les pas d'occurrences de chaque élément dans ce combiné de tableau et de mettre ces derniers dans un nouveau tableau. Ensuite, vérifiez ce nombre de tableau pour les entrées qui contiennent 2, ces éléments sont dans l'intersection des deux ensembles.
Pour tous les éléments de l'ensemble 1: Vérifier si l'élément est dans l'ensemble 2. Vous pouvez mettre en œuvre un Ensemble qui a amorti O(1) recherche du temps.
si l'une des deux listes est ordonné, alors nous pouvons commencer avec la liste non ordonnée
Time Complexity = O(n O(BINARY-SEARCH)) = O(n log n)
si la liste B est
hashed
, puis nous avonsBIG-THETA(C n + T(hash))
où les GRANDS-THETA est l'asymptotique de la moyenne, et
C
est unconstant
et
T(hash)
est le temps nécessaire pour la fonction de hachage