39 votes

Calculer l'intersection en temps linéaire ?

Existe-t-il un algorithme qui, compte tenu de deux ensembles, calcule leur intersection en temps linéaire ?

Je peux exécuter deux boucles for pour vérifier toutes les paires d'éléments, enregistrant les éléments que je trouve dans les deux ensembles. Cependant, le temps d'exécution sera 0(n2). Comment puis-je faire cela en temps O(n) ?

10voto

Nikita Rybak Points 36641

Je me demande si personne n'a parlé de hashtable.
Quelle que soit votre implémentation de set (même si « set » signifie ici un tableau simple), vous pouvez

  1. mettre le contenu du premier ensemble dans hashtable et
  2. itérer sur le second ensemble, en vérifiant si hashtable contient l'élément courant.

O(n)

3voto

sjr Points 5686
intersection(a, b):
  result = new empty set
  for x in b:
    if a contains x:
      add x to result

  return result

Si le test contains est à temps constant (comme dans un ensemble qui utilise une table de hachage comme implémentation), alors cet algorithme est O(n).

0voto

Anon. Points 26829

Pour tous les éléments de l'ensemble 1 : vérifiez si cet élément est dans l'ensemble 2. Vous pouvez implémenter un ensemble qui a amorti le temps de consultation O(1).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X