単純な番号付けの代わりに、CPU整数の整数の最小値と最大値など、大きな(一定のサイズの)範囲に数値を分散させることができます。次に、周囲の2つの数値を平均することで、「間に」数値を挿入し続けることができます。数値が密集しすぎた場合(たとえば、2つの隣接する整数があり、その間に数値がない場合)、順序全体を一度だけ再番号付けして、範囲全体に均等に数値を再配分できます。
もちろん、大きな定数の範囲内のすべての数値が使用されるという制限に遭遇する可能性があります。まず、これは通常は問題ではありません。マシンのinteger-sizeが十分に大きいため、より多くの要素がある場合は、とにかくメモリに収まらない可能性があります。しかし、それが問題である場合は、より大きな整数の範囲で番号を付け直すことができます。
入力順序が病理的でない場合、このメソッドは再番号付けを償却する可能性があります。
質問に答える
単純な整数比較は、クエリ答えることができます。( X<?Y)
単純な整数比較なので、マシン整数を使用すると、クエリ時間は非常に速くなります()。より大きな範囲を使用すると、より大きな整数が必要になり、比較にはがかかり。O (1 )O(ログ| INTEGe r | )
挿入
まず、質問に示されている順序のリンクリストを維持します。ここに挿入する場合、新しい要素を間に配置するノードを指定すると、ます。O (1 )
新しい要素のラベル付けは、周囲の数値を平均することで新しい分子を簡単に計算できるため、通常はです。時々、「間に」数値が足りなくなり、時間の再番号付け手順がトリガーされることがあります。O (1 )O(n )
番号の付け直しを避ける
整数の代わりに浮動小数点数を使用できるため、2つの「隣接する」整数を取得すると、それらを平均化できます。したがって、2つの整数floatに直面したときに番号の付け直しを回避できます。それらを半分に分割するだけです。ただし、最終的には浮動小数点型の精度が不足し、2つの「隣接する」浮動小数点数を平均化できなくなります(周囲の数値の平均は、周囲の数値の1つとおそらく同じになります)。
同様に、「小数点位置」整数を使用できます。この場合、要素に2つの整数を保持します。1つは数値用、もう1つは小数用です。これにより、番号の付け直しを回避できます。ただし、10進整数は最終的にオーバーフローします。
各ラベルに整数またはビットのリストを使用すると、番号の付け直しを完全に回避できます。これは基本的に、長さが無制限の10進数を使用することと同じです。比較は辞書式に行われ、比較時間は関係するリストの長さまで増加します。ただし、これによりラベル付けのバランスが崩れる可能性があります。一部のラベルには整数が1つしか必要ない(小数ではない)場合もあれば、長いリスト(長い小数)を持つ場合もあります。これは問題であり、ここでも番号付け(ここでは番号のリスト)を選択した範囲(ここで範囲とはリストの長さを意味する)に均等に再配布することで、番号付けが役立つ場合があります。 。
このメソッドは、実際にはこのアルゴリズム(実装、関連するデータ構造)で使用されています。アルゴリズムの過程では、任意の順序を維持する必要があり、著者はこれを達成するために整数と再番号付けを使用します。
数字に固執しようとすると、キースペースが多少制限されます。代わりに、比較ロジック "a" <"ab" <"b"を使用して、可変長文字列を使用できます。まだ解決すべき2つの問題が残っていますA.キーが任意に長くなる可能性がありますB.長いキーの比較はコストがかかる可能性があります