La méthode Bently-Saxe donne une file d'attente prioritaire stable assez naturelle.
Stockez vos données dans une séquence de tableaux triés . a une taille . Chaque tableau maintient également un compteur . Les entrées de tableau contiennent des données.A i 2 i c i A i [ c i ] , … , A i [ 2 i - 1 ]UNE0, … , AkUNEje2jecjeUNEje[ cje] , … , Aje[ 2je- 1 ]
Pour chaque , tous les éléments de ont été ajoutés plus récemment que ceux de et au sein de chaque éléments sont classés par valeur, les liens étant rompus en plaçant les éléments plus anciens devant les éléments plus récents. Notez que cela signifie que nous pouvons fusionner et et conserver cet ordre. (En cas d'égalité lors de la fusion, prenez l'élément de .)A i A i + 1 A i A i A i + 1 A i + 1jeUNEjeUNEi + 1UNEjeUNEjeUNEi + 1UNEi + 1
Pour insérer une valeur , recherchez le plus petit tel que contienne 0 élément, fusionnez et , stockez-le dans et définissez manière appropriée.i A i A 0 , … , A i - 1 x A i c 0 , … , c iXjeUNEjeUNE0, … , Ai - 1XUNEjec0, … , Cje
Pour extraire le min, trouver le plus grand indice tel que le premier élément dans soit minimum sur tout et incrémenter .A i [ c i ] i c ijeUNEje[ cje]jecje
Par l'argument standard, cela donne temps amorti par opération et est stable en raison de l'ordre décrit ci-dessus.O ( logn )
Pour une séquence de insertions et extractions, cela utilise n entrées de tableau (ne conservez pas de tableaux vides) plus O ( log n ) mots de données de comptabilité. Cela ne répond pas à la version de Mihai de la question, mais cela montre que la contrainte stable ne nécessite pas beaucoup d'espace au-dessus. En particulier, cela montre qu'il n'y a pas de borne inférieure Ω ( n ) sur l'espace supplémentaire nécessaire.nnO ( logn )Ω ( n )
Mise à jour: Rolf Fagerberg souligne que si nous pouvons stocker des valeurs nulles (non-données), alors toute cette structure de données peut être compressée dans un tableau de taille , où n est le nombre d'insertions jusqu'à présent.nn
Tout d'abord, notez que nous pouvons regrouper les dans un tableau dans cet ordre (avec A k en premier, suivi de A k - 1 s'il n'est pas vide, etc.). La structure de ceci est complètement codée par la représentation binaire de n , le nombre d'éléments insérés jusqu'à présent. Si la représentation binaire de n a un 1 à la position i , alors A i occupera 2 i emplacement de tableau, sinon il n'occupera aucun emplacement de tableau.Ak,…,A0AkAk−1nniAi2i
Lors de l'insertion, et la longueur de notre tableau, augmentez de 1 et nous pouvons fusionner A 0 , … , A i plus le nouvel élément en utilisant des algorithmes de fusion stables en place existants.nA0,…,Ai
Maintenant, où nous utilisons des valeurs nulles, c'est pour se débarrasser des compteurs . Dans A i , nous stockons la première valeur, suivie de c i valeurs nulles, suivie des 2 i - c i - 1 valeurs restantes . Lors d'une extraction-min, on peut toujours trouver la valeur à extraire en temps O ( log n ) en examinant A 0 [ 0 ] , … , A k [ 0 ] . Lorsque nous trouvons cette valeur dans A i [ 0ciAici2i−ci−1O(logn)A0[0],…,Ak[0] nous définissons A i [ 0 ] sur null puis effectuons une recherche binaire sur A i pour trouver la première valeur non nulle A i [ c i ] et permutons A i [ 0 ] et A i [ c i ] .Ai[0]Ai[0]AiAi[ci]Ai[0]Ai[ci]
Le résultat final: la structure entière peut être implémentée avec un tableau dont la longueur est incrémentée à chaque insertion et un compteur, , qui compte le nombre d'insertions.n