このページは私を助けてくれました: http://comments.gmane.org/gmane.comp.programming.algogeeks/30667
しかし、説明できるかどうか見てみましょう。
基本的に問題は、ベクトルが十分に大きい場合、ベクトルをすべて 0 に初期化するのにかなりの時間がかかることです。では、より多くのスペースを使用して 0 への初期化を回避するにはどうすればよいでしょうか? つまり、このベクトル内のランダムなデータと、意図的に配置したデータをどのように区別できるでしょうか?
Bentley の解決策は、データ ベクトルと同じサイズの "from" (マップ) と "to" (署名 [実際には from のインデックスへの逆マップ]) ベクトルと、数値である "top" を使用することです。これまでのデータ配列の要素の数。from[i] < top
以下に説明するように重要です。
ソリューションの例を使用します。データ配列を宣言し、要素数をゼロに設定します。
top = 0
data = int array of integers of size 1,000,000
(all random values since we did not initialize it)
インデックス 1 (この場合は i=1) に要素を挿入します。しかし、それがランダムな値ではないことをどうやって知るのでしょうか? 地図と署名を使用します。「from」のインデックスは、データのインデックスと同じです。
from[i] = top
to[top] = i
data[i] = 0 (I don't think it matters whether you set it to 0 or your intended value of 3)
top++ (top is now 1)
to[from[i]] == i
だから、たまたまだと言うかもしれません。と述べているのでfrom[i] < top
、これは不可能です。
次の 2 つのケースを調べます。
A) データ配列にまだ要素が挿入されていない (つまり、top = 0)from[i] < 0
ため、有効な配列インデックスではありません。したがって、これは不可能です。
B)挿入された要素があります(つまり、トップ> 0、1であるとしましょう)from[i] < top
=> from[i] = 0
. ただし、1 つの要素をデータ配列に挿入したので、明示的に を設定しto[from[i]] = i
ました。
残りは top = 2...n に従います
HTH