Que sait-on des structures de données qui peuvent maintenir une séquence d'éléments soumis aux deux opérations suivantes?
- Appuyez sur (x): ajoutez x à la fin de la séquence et renvoyez un identifiant pour sa position dans la séquence
- Extraire (S): étant donné un ensemble d'identificateurs non ordonné, supprimer les éléments dans ces positions de la séquence et renvoyer une liste des éléments supprimés dans l'ordre de séquence
Si vous le souhaitez, vous pouvez considérer cela comme une pile ou une file d'attente avec une opération de fractionnement qui la divise en deux piles: l'opération d'extraction peut être utilisée pour implémenter une opération de pop ou de mise en file d'attente, et la séquence d'extraits d'éléments pourrait également être mise à nouveau dans une autre pile ou file d'attente.
Ce que je sais déjà: on peut maintenir la séquence comme une liste doublement liée, où chaque identifiant n'est qu'un pointeur vers un nœud de liste liée, et chaque nœud stocke également un numéro de position qui permet des comparaisons rapides entre les positions de deux éléments non liés dans la séquence. Il n'est pas difficile de mettre à jour les numéros de position à mesure que la structure de données progresse afin qu'ils soient tous des entiers positifs de valeur maximale , où est le nombre actuel d'éléments dans la liste. Avec cette structure de données, la seule partie difficile d'une opération d'extraction consiste à trier les éléments extraits par leur numéro de position. Une extraction de éléments prend le temps aléatoire attendu en utilisant l'algorithme de tri d'entiers de Han et Thorup de FOCS 2002, par exemple, et une opération de poussée prend un temps constant.
Ce que je ne sais pas: est-il possible de gérer l'extrait en temps et de pousser en temps constant? Existe-t-il de la littérature sur ce problème? Est-ce aussi difficile que le tri entier?
Motivation: c'est l'étape de base nécessaire pour commander les articles dans l'algorithme d'ordonnancement Coffman-Graham, qui a également des applications dans le dessin de graphiques. La partie difficile de Coffman-Graham est un ordre topologique lexicographique. Cela peut être fait en maintenant, pour chaque degré différent, une séquence des sommets avec ce degré dans le sous-graphique induit par les sommets restants. Ensuite, supprimez à plusieurs reprises le premier sommet de la séquence des sommets zéro degré et ajoutez-le à l'ordre topologique; extraire les voisins de des degrés auxquels ils appartenaient auparavant et les pousser sur la séquence pour le degré plus petit suivant. Donc un le temps nécessaire aux opérations d'extraction dans cette structure de données conduirait à une implémentation temporelle linéaire de l'algorithme Coffman-Graham.
Depuis que j'ai posé cette question à l'origine, j'ai trouvé un article de Sethi de 1976 qui permet à l'algorithme Coffman – Graham d'être implémenté en temps linéaire, et je l' ai inclus dans mon article Wikipedia sur l'algorithme Coffman – Graham , de sorte que la motivation d'origine est moins significative. Je suis toujours curieux de savoir quelle est la réponse, cependant.