償却分析に関する質問


7

アルゴリズムと複雑さに関する試験の準備として、私は現在、古い演習を解いています。初めて遭遇したときにすでに苦労してきた概念の1つは、償却分析の概念です。償却分析とは何ですか?私たちの講義ノートには、「償却分析は特定の操作に必要な「平均時間」の限界を与え、最悪の場合の限界を与えることもある」と述べられています。それは本当に便利に聞こえますが、例について言えば、私が何をしなければならないのかわからず、サンプルソリューションを読んだ後でも、彼らが何をしているのかわかりません。

基数2に1を加算してみましょう。つまり、0、1、10、11、100、101、110、111、1000、...償却分析を使用して、各ステップで変更する必要があるのは常に多くのビットだけを償却することを示します。

(元々はドイツ語での演習なので、完全に正確ではないかもしれない私の翻訳をお詫びします)

ここで、標準解は最初に、いくつかの定数に対してを定義し。これは、潜在的な関数と呼ばれるもので、過剰な時間の単位に何らかの形で対応しているものだと思います(ただし、この特定の定義を思い付く理由はわかりません)。番目のステップでビットを変更する必要があると仮定します。そのようなステップは常に次の形式ですϕ(i):=c#{1-bits in the binary representation}c>0mi

011m100m.

この発言は私には理解できますが、やはりその背後にある動機はわかりません。次に、どこからともなく、彼らは彼らが「見積もり」と呼ぶものを思いつきます

a(i)=m+c(ϕ(i)ϕ(i1))=m+c(m+2)

そして、場合、を取得あると述べています。c=1a(i)=2

今何があったの?何が?なぜを選択できるのですか?一般的に、各ステップで継続的に多くの「単位時間」だけが償却されることを示す必要がある場合、それはが一定でことを示す必要があることを意味しますか?a(i)c=1a(i)

償却分析に関しては他にもいくつかの演習があり、私もそれらを理解していません。誰かがこれを手伝ってくれるなら、他のエクササイズをもう一度試すことができると思いました。多分それが本当にコンセプトを理解するのに役立つでしょう。

助けてくれて本当にありがとう。


あなたは教科書を見ましたか?これは標準的な例であり、分解して、良い本で説明する必要があります。
ラファエル

@ Raphael、IIRCこれはCLRSの第17章からのものです。
Kaveh 2013年

回答:


5

してみましょう操作の償却費も、操作の実際のコストも、および操作後のデータ構造。操作の償却コストは、として定義され あなたは通常、次のことを想定していますaiiciiDii

ai:=ci+Φ(Di)Φ(Di1).
  1. ポテンシャルは常に正、つまり、:iΦ(Di)0
  2. 最初はポテンシャルは0、つまりです。Φ(D0)=0

これらの2つの仮定は必ずしも必要ではありませんが、一般的に使用され、生活を楽にします。これで、以前の操作ですでに支払われたコストの可能性を検討できます。

この定義を正当化するために、すべての操作の累積コストを考慮してください。次の伸縮式合計 したがって、償却原価の合計が実際の総原価を超えていることがわかります。したがって、償却後のコストには上限があります。

i=1nai=i=1n(ci+Φ(Di)Φ(Di1))=Φ(Dn)Φ(D0)+i=1ncii=1nci.

数式でを使用したことはありません。ただし、は潜在的な関数単純に追加できます。したがって、をポテンシャルに重みを付ける要素と考え、関数を再定義して、それを取り除くことができます。ccΦcΦ

具体的な質問にお答えします。は、番目の操作の償却コストを示します。これは、操作課金される一連の操作の実際のコストです。あなたが選ぶことができるいくつかの肯定的な要因です。そして、は一般的に一定ではありません(これらは例にあります -aコストについて何も表示する必要はありません。値は分析の結果です。a(i)iica(i)a(i)a(i)

あなたはドイツ語を話しているように見えるので、潜在的な機能についての私のドイツ語のクラスのノートを見ることもできます。


4

潜在的な関数メソッドは複雑で、例は単純です。変更されるビット数は、1は約半分の時間、2は約4分の1の時間、3は約8分の1の時間などです。これは、変更されたビット数が0から始まり、1、2、1、3、1、2、1、4と続くためです(パターンを取得します)。したがって、変更された平均ビット数は

k=1k2k=k=1l=k12l=k=112k1=2.

1
ポテンシャル関数法が複雑だとは思いません。概念的には非常に簡単です。ただし、特定の問題に対して適切な潜在関数を見つけるのは難しい場合があります。
A.Schulz 2013年

1
私は、これはそれを見るための最良の方法であることに同意していますが、フォームの数取れば、それは良いでしょうと、第二のビットの第1ビットは毎回変化することなど、すべての第四、他のすべての、第三の変更を参照してください2n
PålGD

3

償却分析では、一連の操作の平均として操作の実行時コストが処理されます。 これは、償却という財務概念に似ています。ローンなどの単一の一括金額が一定期間にわたって償却されます。これにより、たとえば、元本の残高が少なくなっても、毎月の支払いが修正されます。

このように、償却実行時間は一種の平均ですが、入力の分布の確率分析を含む平均ケースの実行時間とは異なります。

償却分析を実行するには、3つの標準的な手法があります。(1)集計方法、(2)会計方法、(3)潜在的な方法です。最後の1つは、講義ノートに表示されているものであり、A。シュルツが彼の回答で使用しているものです。また、少し複雑です。

バイナリカウンターをインクリメントするというよく引用された例(および遭遇したもの)から始めて、3つすべての手法の説明を含むJeffEの優れた講義ノートを紹介します。最悪の場合のランタイムがあっても、増分操作の償却コストは、そのような操作のシーケンスで平均するとであることを示してい。O(1)O(logn)

別のリソースは、[CLRS01]の第17章です。これは、別の一般的な例である「マルチポップ」操作のスタックから始まります。


2

問題のステートメントは、0から始まり、値を1ずつインクリメントする操作を持つカウンターと考えると、より明確になると思います。問題のカウンターがインクリメントされるたびに、正確に1ビットがオンになり、0個以上のビットがオフになります。例題の問題の潜在的な機能は、あなたが考えるほど思いがけないものではありません。問題の鍵は、以前にオンにされたビットのみが反転できることです。したがって、インクリメント操作を実行してビットをオンにするたびに、1時間単位を「普通預金口座」(潜在的な関数)に格納し、後でそのビットをオフにするために使用できます。

これは、カウンターをインクリメントするときに、最初に右端のビットを確認するためです。オフになっている場合は、オンにします。オンになっている場合は、それをオフにして、ビットを1つ左に見てください。オフになっている場合は、オンにして停止します。オンになっている場合はオフにして、そのビットの左側にあるビットを確認します。したがって、1回の操作でフリップするビット数は、右から最初の0ビットの位置と等しくなります。

最初は、カウンターとポテンシャル関数はどちらも0です。1つのインクリメント操作を実行すると、カウンターは1になり、ポテンシャル関数も1になります。もう一度インクリメントすると、カウンターは10になります。潜在的な関数は1のままです。次のステップの後、カウンターは11で、ポテンシャル関数2になります。再びカウンターをインクリメントする場合、3ビットを反転して011から移動する必要があります。これには、いくつかのポテンシャルを使用する必要があり、最終的に1の新しいポテンシャルが得られます。トリックは、これまでに実際に反転されたビットの合計数とポテンシャル関数が常に数の2倍に等しいことです。増分操作。潜在的な関数が負になることはないため、インクリメント操作後のビットフリップの総数は最大n2n、そのため、各操作には償却ビットフリップが必要です。2

別の非常に良い例は、配列リストです。ここには、配列に要素を格納することで実装されるリスト(すべての要素の反復と新しい要素の追加をサポート)があります。配列は、最初は非常に小さい(たとえば2か所)です。要素を追加すると、配列に格納されます。3番目の要素を追加しようとすると、配列にスペースがなくなります。これに対抗するために、サイズが2倍の新しい配列を作成し、元の配列からすべての要素をコピーします。これには非常に長い時間がかかる可能性がありますが(要素の数に比例)、償却分析では、各追加操作に一定の時間しかかからないことが示されています。配列リストは、現実の世界では非常にうまく機能します(リンクリストよりもはるかに優れています)。各操作は一定の時間で実行できますが、操作にはるかに長い時間がかかる場合があることに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.