Au lieu d'une simple numérotation, vous pouvez répartir les nombres sur une large plage (de taille constante), comme le minimum et le maximum entiers d'un entier CPU. Ensuite, vous pouvez continuer à mettre des nombres "entre" en faisant la moyenne des deux nombres environnants. Si les nombres deviennent trop encombrés (par exemple, vous vous retrouvez avec deux entiers adjacents et qu'il n'y a pas de nombre entre les deux), vous pouvez effectuer une renumérotation unique de l'ensemble de la commande, en redistribuant les nombres de manière égale sur toute la plage.
Bien sûr, vous pouvez rencontrer la limitation selon laquelle tous les nombres compris dans la plage de la grande constante sont utilisés. Tout d'abord, ce n'est généralement pas un problème, car la taille entière sur une machine est suffisamment grande pour que si vous aviez plus d'éléments, elle ne rentrerait probablement pas dans la mémoire de toute façon. Mais s'il s'agit d'un problème, vous pouvez simplement les renuméroter avec une plage entière plus grande.
Si l'ordre d'entrée n'est pas pathologique, cette méthode peut amortir les renumérotations.
Répondre aux requêtes
Une simple comparaison d'entiers peut répondre à la requête ( X<?Oui).
Le temps de requête serait très rapide ( O ( 1 )) si vous utilisez des entiers machine, car il s'agit d'une simple comparaison d'entiers. L'utilisation d'une plus grande plage nécessiterait de plus grands nombres entiers, et la comparaison prendraitO ( log| intege r | ).
Insertion
Premièrement, vous maintiendrez la liste chaînée de la commande, illustrée dans la question. L'insertion ici, étant donné les nœuds pour placer le nouvel élément entre les deux, seraitO ( 1 ).
L'étiquetage du nouvel élément serait généralement rapide O ( 1 )parce que vous calculeriez facilement le nouveau nombre en faisant la moyenne des nombres environnants. Parfois, vous pourriez manquer de nombres "entre les deux", ce qui déclencherait laO ( n ) procédure de renumérotation horaire.
Éviter la renumérotation
Vous pouvez utiliser des flottants au lieu d'entiers, donc lorsque vous obtenez deux entiers "adjacents", ils peuvent être moyennés. Ainsi, vous pouvez éviter de renuméroter face à deux flottants entiers: il suffit de les diviser en deux. Cependant, le type à virgule flottante finira par manquer de précision et deux flotteurs "adjacents" ne pourront pas être moyennés (la moyenne des nombres environnants sera probablement égale à l'un des nombres environnants).
Vous pouvez également utiliser un entier "décimal", où vous conservez deux entiers pour un élément; un pour le nombre et un pour la décimale. De cette façon, vous pouvez éviter de renuméroter. Cependant, l'entier décimal débordera éventuellement.
L'utilisation d'une liste d'entiers ou de bits pour chaque étiquette peut entièrement éviter la renumérotation; cela revient à utiliser des nombres décimaux de longueur illimitée. La comparaison se ferait lexicographiquement et les temps de comparaison augmenteront jusqu'à la longueur des listes concernées. Cependant, cela peut déséquilibrer l'étiquetage; certaines étiquettes peuvent nécessiter un seul entier (pas de décimales), d'autres peuvent avoir une liste de longues longueurs (longues décimales). C'est un problème, et la renumérotation peut aussi aider ici, en redistribuant la numérotation (ici des listes de numéros) uniformément sur une plage choisie (plage ici signifiant peut-être la longueur des listes) de sorte qu'après une telle renumérotation, les listes soient toutes de la même longueur .
Cette méthode est effectivement utilisée dans cet algorithme ( implémentation , structure de données pertinente ); au cours de l'algorithme, un ordre arbitraire doit être conservé et l'auteur utilise des entiers et une renumérotation pour y parvenir.
Essayer de s'en tenir aux chiffres rend votre espace clé quelque peu limité. On pourrait utiliser des chaînes de longueur variable à la place, en utilisant la logique de comparaison "a" <"ab" <"b". Il reste encore deux problèmes à résoudre A. Les clés pourraient devenir arbitrairement longues B. La comparaison des clés longues pourrait devenir coûteuse