Quelles sont les complexités temporelles des différentes structures de données?

86

J'essaie de lister les complexités temporelles des opérations des structures de données communes comme les tableaux, l'arbre de recherche binaire, le tas, la liste liée, etc. et surtout je fais référence à Java. Ils sont très courants, mais je suppose que certains d'entre nous ne sont pas sûrs à 100% de la réponse exacte. Toute aide, en particulier les références, est grandement appréciée.

Par exemple, pour une liste chaînée unique: la modification d'un élément interne est O (1). Comment peux-tu le faire? Vous DEVEZ rechercher l'élément avant de le modifier. De plus, pour le vecteur, l'ajout d'un élément interne est donné par O (n). Mais pourquoi ne pouvons-nous pas le faire en temps constant amorti en utilisant l'indice? Veuillez me corriger si je manque quelque chose.

Je publie mes conclusions / suppositions comme première réponse.

Bhushan
la source
2
Complexités temporelles et spatiales pour toutes les structures de données
Aide
1
Au cas où quelqu'un d'autre interviendrait, prenez une minute pour vérifier également ce lien: infotechgems.blogspot.gr/2011/11/…
vefthym

Réponses:

244

Tableaux

  • Définir, vérifier l' élément à un index particulier: O (1)
  • Recherche : O (n) si le tableau n'est pas trié et O (log n) si le tableau est trié et quelque chose comme une recherche binaire est utilisé,
  • Comme l'a souligné Aivean , aucune Deleteopération n'est disponible sur les tableaux. Nous pouvons supprimer symboliquement un élément en le définissant sur une valeur spécifique, par exemple -1, 0, etc. en fonction de nos besoins
  • De même, Insertpour les tableaux est fondamentalement Setcomme mentionné au début

Liste des tableaux:

  • Ajouter : O amorti (1)
  • Supprimer : O (n)
  • Contient : O (n)
  • Taille : O (1)

Liste liée:

  • Insertion : O (1) , si fait en tête, O (n) si n'importe où ailleurs puisque nous devons atteindre cette position en parcourant la liste chaînée linéairement.
  • Suppression : O (1) , si elle est effectuée en tête, O (n) si ailleurs puisque nous devons atteindre cette position en parcourant la liste chaînée linéairement.
  • Recherche : O (n)

Liste à double lien:

  • Insertion : O (1) , si fait en tête ou en queue, O (n) si n'importe où ailleurs puisque nous devons atteindre cette position en parcourant la liste chaînée linéairement.
  • Suppression : O (1) , si elle est effectuée en tête ou en queue, O (n) si n'importe où ailleurs puisque nous devons atteindre cette position en parcourant la liste chaînée linéairement.
  • Recherche : O (n)

Empiler:

  • Pousser : O (1)
  • Pop : O (1)
  • Haut : O (1)
  • Recherche (quelque chose comme la recherche, comme opération spéciale): O (n) (je suppose)

File d'attente / Deque / File d'attente circulaire:

  • Insérer : O (1)
  • Retirer : O (1)
  • Taille : O (1)

Arbre de recherche binaire:

  • Insérer, supprimer et rechercher : Cas moyen: O (log n) , pire cas: O (n)

Arbre rouge-noir:

  • Insérer, supprimer et rechercher : Cas moyen: O (log n) , pire cas: O (log n)

Heap / PriorityQueue (min / max):

  • Trouver Min / Trouver Max : O (1)
  • Insérer : O (log n)
  • Supprimer Min / Supprimer Max : O (log n)
  • Extraire Min / Extraire Max : O (log n)
  • Rechercher, supprimer (si fourni): O (n) , nous devrons scanner tous les éléments car ils ne sont pas classés comme BST

HashMap / Hashtable / HashSet:

  • Insérer / Supprimer : O (1) amorti
  • Redimensionner / hachage : O (n)
  • Contient : O (1)
Bhushan
la source
3
Insérer un élément dans Array (et par insertion, je veux dire ajouter un nouvel élément en position, déplacer tous les éléments vers la droite) prendra O (n). Idem pour la suppression. Seul le remplacement de l'élément existant prendra O (n). Il est également possible que vous le mélangiez avec l'ajout d'un nouvel élément au tableau redimensionnable (il a amorti le temps O (1)).
Aivean
Veuillez également noter que pour les listes à double chaînage, l'insertion et la suppression à la fois en tête et en queue prendront O (1) (vous avez mentionné uniquement la tête).
Aivean
Et note finale, les arbres de recherche équilibrés (par exemple, l'arbre rouge-noir qui est réellement utilisé pour TreeMap en Java) a garanti le pire des cas de O (ln n) pour toutes les opérations.
Aivean
@Aivean: J'essaie juste de lister les opérations standard pour les structures de données standard. Pour les tableaux: déplacer des éléments lors de l'ajout / de la suppression n'est pas une opération standard. En outre, le remplacement d'un élément existant prend O (1) en utilisant index, pas O (n). Pour la liste à double lien: Vous avez raison, je fais une correction. Pour les arbres rouge-noir: encore une fois, vous avez raison. Mais je n'ai énuméré qu'un BST, qui n'a pas besoin d'être équilibré. Donc, je vais ajouter une nouvelle entrée pour les arbres rouge-noir. Merci pour les commentaires!
Bhushan
1
@SuhailGupta: La complexité pour Set est déjà donnée comme dernier point.
Bhushan