2017-06-16 12 views
-4

動的配列のサイズ変更に関する質問(ArrayList ADTの一部として)が私を困惑させました。ダイナミック配列リサイズの償却解析

テキストは、要素が配列の最後に追加されるシナリオを設定します。配列がその容量に達すると、そのサイズは倍になります。新しい大きな配列は、古い配列の要素で初期化されます。このプロセスの償却分析は、O(n)の複雑さをもたらす。

は、その後、次の質問が尋ねられる:容量Nのアレイが、代わりに容量の2Nの配列にN個の要素をコピーするいっぱいになると、それらはN/4の配列にコピーされ

追加のセル、すなわち容量のアレイ(N + N/4)。 へのn個の追加シーケンスを実行すると、配列は依然としてO(n)で実行されることを示します。

どのようなヒント、この質問にアプローチする上での助けが大歓迎です。私は、フル・キャパシティのアレイが現在のサイズの倍数ではなく、そのサイズのほんの少しだけサイズが増えているという事実をどう扱うべきか分かりません。

+0

私は質問から次のメタコメントを切り詰めました:*この質問は、それがダウン投票された後の明快さを改善するために編集されました。ここに初めて投稿する辛抱強く/助けてください!*。 – halfer

答えて

0

連続コピーはその結果、Kのコピーの後、コピーの総コストは

sum(i=0,K-1){ N(5/4)^i } 
サイズN、N(5/4)、N(5/4)^ 2、...

であるました

その時点で、アレイのサイズはN(5/4)^(K-1)です。

だから残っているすべては言葉で

O([ sum(i=0,K-1){ N(5/4)^i } ]/[ N(5/4)^(K-1) ]) = O(1) . 

が、これはコストを償却される配列要素、あたりのコピーの総コストがあることを示すことです。式が真で表示

は非常に簡単です、そしてロジックはずっと倍増のための同様の関係を示すと同じです:

O([ sum(i=0,K-1){ N(2)^i } ]/[ N(2)^(K-1) ]) 

私はあなたの楽しみを奪うことはありません。

+0

ありがとう@Gene。配列のサイズを変更してより多くの要素を収容できるので、K個のコピーの後に配列はサイズ> N(5/4)^(K-1)を持たないでしょうか?私はおそらくここでニックピッキングしていると思う(私がいれば申し訳ありません!)。これはまだ定数として出てくるので、おそらくこれは大きなO式に影響しません...? – Brickoid

+0

@Brickoid "size"とはコピーしたサイズを意味します。通常、古い要素をコピーして新しい要素を追加できます。新しい要素を割り当てることはコピーとしてカウントされません – Gene

+0

はい、意味があります:) – Brickoid