動的配列の分析を読んでいます(Skienaのアルゴリズムマニュアルから)。
つまり、配列構造があり、スペースがなくなるたびに、元のサイズの2倍のサイズの新しい配列を割り当てます。
これは、アレイのサイズを変更する必要があるときに発生する無駄について説明しています。
これは、(n / 2)+1からnまでが最大で1回移動されるか、まったく移動されないことを示しています。これは明らかです。
次に、要素の半分が1回移動し、要素の4分の1が2回移動する、などと記述すると、移動の総数Mは次のようになります。
これは実際に起こるよりも多くのコピーを追加するように私には思えます。
例えば
以下の場合:
array of 1 element
+--+
|a |
+--+
double the array (2 elements)
+--++--+
|a ||b |
+--++--+
double the array (4 elements)
+--++--++--++--+
|a ||b ||c ||c |
+--++--++--++--+
double the array (8 elements)
+--++--++--++--++--++--++--++--+
|a ||b ||c ||c ||x ||x ||x ||x |
+--++--++--++--++--++--++--++--+
double the array (16 elements)
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
|a ||b ||c ||c ||x ||x ||x ||x || || || || || || || || |
+--++--++--++--++--++--++--++--++--++--++--++--++--++--++--++--+
x要素を4回コピーし、c要素を4回コピーし、b要素を4回コピーし、1つの要素を5回コピーしたため、合計は4 + 4 + 4 + 5 = 17コピー/移動です。
しかし、式によれば、1 *(16/2)+ 2 *(16/4)+ 3 *(16/8)+ 4 *(16/16)= 8 + 8 + 6 + 4 = 26のコピーが必要です配列を16要素に拡大するための要素。
これはいくつかの間違いですか、それとも式の目的はおおよその上限近似値を提供することですか?または私はここで何かを誤解していますか?
b
コピーは3回、各c
2回、各x
1回です。15部。