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 ?
GetElement (k) : retourne le ème élément de la liste.
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.
Réponses:
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).
la source
[1] Patrascu, Mihai et Erik D. Demaine. «Limites logarithmiques inférieures dans le modèle cellule-sonde». SIAM J. Comput. 35, non. 4 (avril 2006): 932–963. doi: 10.1137 / S0097539705447256.
la source