web-dev-qa-db-fra.com

Tableaux de notation Big O et insertions dans la liste chaînée

Tableaux de notation Big O et insertions dans la liste chaînée:

Selon la littérature académique pour les tableaux, il est constant O(1) et pour les listes chaînées, il est linéaire O (n).

Un tableau prend seulement une multiplication et addition.

Une liste chaînée qui ne figure pas dans la mémoire contiguë nécessite une traversée.

Cette question est la suivante: O(1) et O(n) décrivent-ils avec précision les coûts d'indexation/de recherche pour les tableaux et les listes chaînées respectivement?

19
user656925

O(1) décrit avec précision l'insertion à la fin du tableau. Toutefois, si vous insérez au milieu d'un tableau, vous devez déplacer tous les éléments après cet élément. La complexité de l'insertion dans ce cas est donc O(n) pour les tableaux. La fin de l'ajout réduit également le cas où vous auriez à redimensionner un tableau s'il est plein.

Pour une liste chaînée, vous devez parcourir la liste pour faire des insertions intermédiaires, donc c'est O(n). Vous n'êtes pas obligé de déplacer les éléments vers le bas si.

Il y a une belle carte sur wikipedia avec ceci: http://en.wikipedia.org/wiki/Linked_list#Linked_lists_vs._dynamic_arrays

                          Linked list   Array   Dynamic array   Balanced tree

Indexing                          Θ(n)   Θ(1)       Θ(1)             Θ(log n)
Insert/delete at beginning        Θ(1)   N/A        Θ(n)             Θ(log n)
Insert/delete at end              Θ(1)   N/A        Θ(1) amortized   Θ(log n)
Insert/delete in middle     search time 
                                + Θ(1)   N/A        Θ(n)             Θ(log n)
Wasted space (average)            Θ(n)    0         Θ(n)[2]          Θ(n)
34
wkl

En supposant que vous parlez d’une insertion dont vous connaissez déjà le point d’insertion, c’est-à-dire que cela ne prend pas en compte le parcours de la liste pour trouver la position correcte:

Les insertions dans un tableau dépendent de l'endroit où vous insérez, car vous devrez déplacer les valeurs existantes. Le cas le plus défavorable (l'insertion dans le tableau [0]) est O (x).

L'insertion dans une liste est O(1) car il vous suffit de modifier les pointeurs suivant/précédent d'éléments adjacents.

2
tinman

À quelle littérature faites-vous référence? La taille d'un tableau est déterminée lors de sa création et ne change jamais par la suite. L'insertion ne peut réellement avoir lieu que sur des emplacements libres à la fin du tableau. Tout autre type d'insertion peut nécessiter un redimensionnement et ce n'est certainement pas O(1). La taille d'une liste chaînée dépend de l'implémentation, mais doit toujours être au moins assez grande pour stocker tous ses éléments. Les éléments peuvent être insérés n'importe où dans la liste, et la recherche de l'index approprié nécessite un parcours.

0
Amir Afghani

L'insertion pour les tableaux que j'imagine est plus lente. Bien sûr, vous devez parcourir une liste chaînée, mais vous devez allouer, enregistrer et libérer de la mémoire pour l'insérer dans un tableau.

0
MGZero