web-dev-qa-db-ja.com

償却分析? (ワーストケースのパフォーマンス保証)

償却分析とは何ですか?また、プログラムで最悪の場合のパフォーマンス保証を達成するのにどのように役立ちますか?

私は reading 以下のテクニックがプログラマーの達成を支援できることワーストケースのパフォーマンス保証(つまり、私自身の言葉では:プログラムの実行時間が最悪のキャストでの実行時間):

  • ランダム化されたアルゴリズム(例:最悪の場合、クイックソートアルゴリズムは2次式ですが、入力をランダムに順序付けすると、実行時間が線形であることを確率的に保証できます)
  • 操作のシーケンス(私たちの分析では、データとクライアントが実行した操作のシーケンスの両方を考慮する必要があります)
  • Amortized Analysis(パフォーマンス保証を提供する別の方法は、すべての操作の総コストを追跡することにより、コストをこの設定では、操作の平均コストを低く抑えながら、いくつかの高価な操作を許可できます。つまり、いくつかの高価な操作の一部を多数の安価な操作のそれぞれに割り当てることで、その操作のコストを分散させます。操作)

著者は、償却分析を実現する方法の一例としてStackの配列データ構造のサイズ変更の使用に言及しましたが、償却分析とは何か、実際にどのようにできるかについてはまだわかりませんimplemented(データ構造?アルゴリズム?)最悪のキャストのパフォーマンスを保証

13
Anthony

償却分析を実装しません。これは、より正確なO境界を取得するための手法です。

あなたがしなければならない本質的な観察は、高価な操作はいつでも起こり得ないということです。

配列に基づくデータ構造の場合、配列がいっぱいになると、時々、配列のサイズを変更する必要があります。これは最もコストのかかる操作であり、O(n)時間かかります。配列への他のすべての挿入はO(1)です。

nアイテムを挿入するためのランタイムを決定するには、nに最もコストの高い操作O(n)を掛けると、全体的なランタイム動作がO(n^2)になります。

ただし、サイズ変更が頻繁に発生することはないため、これは不正確です。

お金について話すとき、あなたはコストを償却しますは、時間の経過とともに複数の小額の支払いで借金を返済するときです。

このモデルを使用して、アルゴリズムについても考えることができます。メンタルマッピングを回避するために、単に「時間」を「お金」に置き換えます。

配列がその長さnに満たされると、サイズを2倍にできます。次の操作を行う必要があります。

  • 2nチャンクのメモリを割り当てる
  • nアイテムをコピー

メモリの割り当てとコピーの両方が線形時間で発生すると仮定すると、これは非常にコストのかかる操作になります。ただし、負債の考え方を使用して分析に使用することができます。ただ、実際にそれを実行する前に、負債を償却します。
配列のサイズを変更したら、(お金/時間の)残高が0に戻ると仮定します(つまり、借金がなく、残り物もありません)。

これには次の影響があります。

  • 次のnアイテムを挿入すると、サイズ変更とコピーのコストがカバーされます(n使用済みスロットとn未使用スロット `があります)

これで、すべての挿入操作がどれだけの費用を支払う必要があるかを考えることができます。

  • インサート
  • メモリの1つのチャンクを割り当てるコスト
  • 新しく割り当てられたメモリに移動するコスト

これで、メモリの割り当て、次のn要素のコピーと挿入のコストについて説明しました。ただし、古いn要素へのスペースの割り当てとそれらのコピーはまだ無視されています。

古いn要素のコストを新しい(まだ挿入されていない)n要素に分配するだけです。

  • メモリの1つのチャンクを割り当てるコスト
  • 新しく割り当てられたメモリに移動するコスト

合計すると、すべての挿入操作に5ユニットかかります。これは、それ自体の挿入、およびそれ自体と古い要素の1つのためのスペースの移動と割り当てに費用がかかります。

すべての挿入操作には依然として一定の時間がかかりますが、サイズ変更は無料で行われます。挿入ごとに「より多く」の時間を費やすことで、サイズ変更を償却しました。

その結果、n要素の挿入にはO(n)時間かかります。

償却分析の他の手法は ここで説明 です。

14
phant0m

まず、これはプログラムの実行時間を分析するための手法であり、アルゴリズムの実装手法ではありません。

リストに記載されている例は良い例です。単一の項目を配列で裏付けられたデータ構造に追加します。単一の追加操作ごとに、最悪の場合はすべての既存の項目をコピーする必要があります。適切なサイズ変更戦略(サイズにx> 1.0を掛ける)を使用している場合は、そうする必要がないので、この種の分析はあまりにも悲観的です。次に、分析により、O(n ^ 2)のバインドがあると表示されます-O(n)アイテム×nアイテム)-実際のランタイムはO(n)のみです。

挿入されたすべてのアイテム(ほとんどがサイズ変更が不要)のサイズ変更コストを平均化すると、償却分析が行われます。償却分析の結果、O(n)境界となり、アルゴリズムの実際の動作と一致します。

1
Patrick