Structure de données avec recherche, insertion et suppression en temps amorti


25

Existe-t-il une structure de données pour gérer une liste ordonnée qui prend en charge les opérations suivantes en temps amorti ?O(1)

  • GetElement (k) : retourne le ème élément de la liste.k

  • InsertAfter (x, y) : insérez le nouvel élément y dans la liste immédiatement après x.

  • Supprimer (x) : supprimez x de la liste.

Pour les deux dernières opérations, vous pouvez supposer que x est donné comme pointeur directement dans la structure de données; InsertElement renvoie le pointeur correspondant pour y. InsertAfter (NULL, y) insère y au début de la liste.

Par exemple, à partir d'une structure de données vide, les opérations suivantes mettent à jour la liste ordonnée comme indiqué ci-dessous:

  • InsertAfter (NULL, a) [a]
  • InsertAfter (NULL, b) [b, a]
  • InsérerAprès (b, c) [b, c, a]
  • InsérerAprès (a, d) [b, c, a, d]
  • Supprimer (c) [b, a, d]

Après ces cinq mises à jour, GetElement (2) doit retourner d et GetElement (3) doit renvoyer une erreur.


2
Dans Optimal Algorithms for List Indexing and Subset Rank (1989), j'ai trouvé une solution à ce problème. Ω(log nlog log n)
AU

2
@Raphael: Je pense qu'il veut dire l'élément qui serait appelé si la structure de données était un tableau. Les tableaux prennent en charge la première opération en temps mais pas la seconde; les listes liées prennent en charge la deuxième opération en temps mais pas la première. O ( 1 ) O ( 1 )A[k]O(1)O(1)
JeffE

2
De plus, les arbres binaires équilibrés prennent en charge les deux opérations en temps . O(logn)
JeffE

1
@Raphael: édité pour clarifier.
JeffE

2
@JeffE le tableau dynamique prend en charge les deux premiers en temps amorti ( cs.uwaterloo.ca/research/tr/1999/09/CS-99-09.pdf )O(1)
Diego

Réponses:


33

NON.

Fredman et Saks ont prouvé que toute structure de données prenant en charge ces opérations nécessite au moins temps amorti par opération . (Il s'agit de la référence [1] dans l'article de Dietz que vous mentionnez dans votre premier commentaire.) La borne inférieure tient dans le modèle de calcul de sonde cellulaire très puissant, qui ne prend en compte que le nombre d'adresses de mémoire distinctes accessibles par la mise à jour et la requête algorithmes.Ω(logn/loglogn)

Sans quelques hypothèses supplémentaires sur les opérations de mise à jour et de requête, la structure de données de Dietz est la meilleure possible (au moins jusqu'à des facteurs constants).


3
@AT: Cette limite n'a jamais été "prouvée fausse". Il y a des situations où cela ne s'applique pas, mais c'est une déclaration entièrement différente!
Raphael

5
@AT: La borne inférieure de tri a été prouvée dans un modèle de calcul beaucoup plus faible, à savoir les arbres de décision binaires. La limite a été "prouvée fausse" en développant des algorithmes plus rapides qui ne peuvent pas être décrits comme des arbres de décision binaires. Afin de prouver que la borne inférieure de Fredman et Saks est erronée, vous devrez concevoir un algorithme plus rapide qui n'accède pas à la mémoire . Bonne chance.
JeffE

@JeffE et Raphael; veuillez revoir mon autre réponse et confirmer / refuser mon résultat lorsque vous en aurez l'occasion. Merci.
AU

6

1
Ω(logn/loglogn)

Effectivement. Pouvez-vous également confirmer que cette limite s'applique au problème de représentation de liste avec des mots de taille constante?
AU

1
Θ(logn/loglogn) Ω(logn)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.