償却分析とは何ですか?また、プログラムで最悪の場合のパフォーマンス保証を達成するのにどのように役立ちますか?
私は reading 以下のテクニックがプログラマーの達成を支援できることワーストケースのパフォーマンス保証(つまり、私自身の言葉では:プログラムの実行時間が最悪のキャストでの実行時間):
著者は、償却分析を実現する方法の一例としてStackの配列データ構造のサイズ変更の使用に言及しましたが、償却分析とは何か、実際にどのようにできるかについてはまだわかりませんimplemented(データ構造?アルゴリズム?)最悪のキャストのパフォーマンスを保証
償却分析を実装しません。これは、より正確なO
境界を取得するための手法です。
あなたがしなければならない本質的な観察は、高価な操作はいつでも起こり得ないということです。
配列に基づくデータ構造の場合、配列がいっぱいになると、時々、配列のサイズを変更する必要があります。これは最もコストのかかる操作であり、O(n)
時間かかります。配列への他のすべての挿入はO(1)
です。
n
アイテムを挿入するためのランタイムを決定するには、n
に最もコストの高い操作O(n)
を掛けると、全体的なランタイム動作がO(n^2)
になります。
ただし、サイズ変更が頻繁に発生することはないため、これは不正確です。
お金について話すとき、あなたはコストを償却しますは、時間の経過とともに複数の小額の支払いで借金を返済するときです。
このモデルを使用して、アルゴリズムについても考えることができます。メンタルマッピングを回避するために、単に「時間」を「お金」に置き換えます。
配列がその長さn
に満たされると、サイズを2倍にできます。次の操作を行う必要があります。
2n
チャンクのメモリを割り当てるn
アイテムをコピーメモリの割り当てとコピーの両方が線形時間で発生すると仮定すると、これは非常にコストのかかる操作になります。ただし、負債の考え方を使用して分析に使用することができます。ただ、実際にそれを実行する前に、負債を償却します。
配列のサイズを変更したら、(お金/時間の)残高が0に戻ると仮定します(つまり、借金がなく、残り物もありません)。
これには次の影響があります。
n
アイテムを挿入すると、サイズ変更とコピーのコストがカバーされます(n
使用済みスロットとn
未使用スロット `があります)これで、すべての挿入操作がどれだけの費用を支払う必要があるかを考えることができます。
これで、メモリの割り当て、次のn
要素のコピーと挿入のコストについて説明しました。ただし、古いn
要素へのスペースの割り当てとそれらのコピーはまだ無視されています。
古いn
要素のコストを新しい(まだ挿入されていない)n
要素に分配するだけです。
合計すると、すべての挿入操作に5ユニットかかります。これは、それ自体の挿入、およびそれ自体と古い要素の1つのためのスペースの移動と割り当てに費用がかかります。
すべての挿入操作には依然として一定の時間がかかりますが、サイズ変更は無料で行われます。挿入ごとに「より多く」の時間を費やすことで、サイズ変更を償却しました。
その結果、n
要素の挿入にはO(n)
時間かかります。
償却分析の他の手法は ここで説明 です。
まず、これはプログラムの実行時間を分析するための手法であり、アルゴリズムの実装手法ではありません。
リストに記載されている例は良い例です。単一の項目を配列で裏付けられたデータ構造に追加します。単一の追加操作ごとに、最悪の場合はすべての既存の項目をコピーする必要があります。適切なサイズ変更戦略(サイズにx> 1.0を掛ける)を使用している場合は、そうする必要がないので、この種の分析はあまりにも悲観的です。次に、分析により、O(n ^ 2)のバインドがあると表示されます-O(n)アイテム×nアイテム)-実際のランタイムはO(n)のみです。
挿入されたすべてのアイテム(ほとんどがサイズ変更が不要)のサイズ変更コストを平均化すると、償却分析が行われます。償却分析の結果、O(n)境界となり、アルゴリズムの実際の動作と一致します。