硬貨交換問題の貪欲なアルゴリズム(最小数の硬貨で特定の金額を支払う)がどのように機能するかを理解します-常に残額を超えない最大額面の硬貨を選択します-そしてそれは常に正しい解を見つけます特定のコインセット。
ただし、一部のコインセットでは、欲張りアルゴリズムが失敗する合計があります。たとえば、セット{1, 15, 25}
と合計30、貪欲なアルゴリズムは最初に25を選択し、残りの5を残してから5つの1を残して合計6コインにします。しかし、コインの最小数を使用したソリューションは、15を2回選択することです。
貪欲なアルゴリズムがすべての合計の最小解を見つけるために、コインのセットが満たすべき条件は何ですか?
マトロイドを形成するセット( https://en.wikipedia.org/wiki/Matroid )を使用して、貪欲なアプローチを使用することにより、コイン交換の問題を解決できます。手短に言えば、マトロイドは、次の条件を満たすM =(S、l)の順序ペアです。
コインの交換の問題では、Sは降順の値のすべてのコインのセットです。Sの最小コイン数でVの値を達成する必要があります。
この場合、lはすべてのサブセットを含む独立したセットであり、各サブセットについて以下が成り立つようになっています。それらの値の合計は<= V
セットがマトロイドの場合、答えはlの最大セットAで、xをさらに追加することはできません
チェックするために、マトロイドのプロパティがセットS = {25,15,1}で保持されているかどうかを確認します。ここで、V = 30です。今、lには2つのサブセットがあります。 | A | <| B |、その後、A U {x}-> l(According 3)というように、いくつかの要素x-> B-Aがあります。したがって、{25,15}はlに属しますが、25 + 15> 30
したがって、Sはマトロイドではないため、貪欲なアプローチは機能しません。
最も低い金種に追加されたときに、その値よりもすぐに小さい金種の値の2倍より低いコインが存在しない場合は、欲張りアルゴリズムが機能します。
つまり、[1,3]と[2,2]は同じ値に加算されるため{1,2,3}は機能しますが、(変更30の場合)15 + 15> 25のため{1、15、25}は機能しません+1
これは再発の問題です。コインのセット_{Cn, Cn-1, . . ., 1}
_が与えられると、_1 <= k <= n, Ck > Ck-1
_の場合、Ck> Ck-1 + Ck-2で値V=(Ck + Ck-1) - 1
の場合、貪欲アルゴリズムはコインの最小数を生成します、貪欲アルゴリズムをコインのサブセット_{Ck, Ck-1, . . ., 1}
_に適用すると、_Ck <= V
_の場合、コインのサブセット_{Ck-1, Ck-2, . . ., 1}
_に貪欲アルゴリズムを適用した結果よりもコインの数が少なくなります。
テストは簡単です。`1<= k <= nの場合、貪欲アルゴリズムがCk + Ck-1-1の値に対して生成するコインの数をテストします。これをコインセット{Ck、Ck-1、。 。 。、1}および{Ck-1、Ck-2、。 。 。、1}。 kについて、後者が前者よりも少ないコインを生み出す場合、貪欲アルゴリズムはこのコインセットに対して機能しません。
たとえば、n = 4の場合、コインセット{C4、C3、C2、1} = {50,25,10,1}を考えます。 k = n = 4から開始し、テスト値としてV = Cn + Cn-1-1 = 50 + 25-1 = 74 V = 74の場合、G {50,25,10,1} = 7コイン。 G {25、10、1} = 8コイン。ここまでは順調ですね。ここで、k = 3とします。次に、V = 25 + 10-1 = 34。 G {25、10、1} = 10コインですが、G {10、1} = 7コインです。したがって、欲張りアルゴリズムは、コインセット{50,25,10,1}のコイン数を最小化しないことを知っています。一方、このコインセットにニッケルを追加すると、G {25、10、5、1} = 6およびG {10、5、1} = 7になります。同様に、V = 10 + 5-1 =の場合14、G {10、5、1} = 5が得られますが、G {5,1} = 6です。したがって、Greedyは{50,25,10,5,1}で動作します。
それは疑問を投げかけます:1から100までの値に対して最小の最悪ケースのコインをもたらす貪欲アルゴリズムを満たすコインの額面は何であるべきか?答えは非常に簡単です。100枚のコインで、それぞれ1〜100の値があります。これは、トランザクションごとにコインを線形検索するので、おそらくあまり役に立ちません。非常に多くの異なる金種を鋳造して追跡する費用は言うまでもありません。
ここで、主に宗派の数を最小限に抑えながら、貪欲によって生み出された1から100までの任意の値の結果のコインの数を二次的に最小限に抑えたい場合、2の累乗のコイン:{64、32、16、8、4 、2、1}は、1:100の値(最大値は10進数100未満の7ビット数の1の最大数)に対して最大6コインになります。しかし、これにはコインの7種類が必要です。 5つの宗派{50、25、10、5、1}の最悪のケースは8で、V = 94とV = 99で発生します。 3の累乗のコイン{1、3、9、27、81}でもGreedyが使用できるのは5種類のみですが、62および80の値で8コインという最悪のケースも生じます。 「64」、「32」、「16」、「8」、「4」、「2」、「1」のサブセットは、「1」を除外できず、貪欲を満たしますが、最大8コインになります。したがって、線形のトレードオフがあります。宗派の数を5から7に増やすと、1から100までの任意の値を表すのに必要なコインの最大数がそれぞれ8から6に減少します。
一方、買い手と売り手の間の硬貨exchangedの数を最小限に抑えたい場合は、それぞれのポケットに硬貨が少なくとも1枚あると仮定し、この問題は、1〜Nポンドの重量のバランスを取るために必要な最小重量に相当します。コイン単位が3の累乗で与えられている場合、購入で交換されるコインの数が最も少ないことがわかります。_{1, 3, 9, 27, . . .}
_。
貪欲アルゴリズムによって変化で与えられたコインの数がすべての量に対して最適な場合、コインシステムは正規です。
このペーパーでは、コインシステムが正規であるかどうかを判断するためのO(n ^ 3)アルゴリズムを提供します。nは異なる種類のコインの数です。
非正規コインシステムの場合、欲張りアルゴリズムが最適以下の数のコインを生成する量c
があります。 c
は反例と呼ばれます。最小の反例が最大の単一コインよりも大きい場合、コインシステムはタイトです。