主題
Search

貪婪演算法


一種用於從儘可能小的組成部分遞迴構造物件集合的演算法。

給定一個 集合k整數 (a_1, a_2, ..., a_k),其中 a_1<a_2<...<a_k,可以使用貪婪演算法找到係數的向量 (c_1, c_2, ..., c_k) 使得

 sum_(i=1)^kc_ia_i=c·a=n,
(1)

其中 c·a點積,對於給定的整數 n。這可以透過令 c_i=0 對於 i=1, ..., k-1 並設定

 c_k=|_n/(a_k)_|,
(2)

其中 |_x_| 是向下取整函式。現在定義表示與 n 之間的差為

 Delta=n-c·a.
(3)

如果在任何步驟 Delta=0,則已找到表示。否則,遞減具有最小 i 的非零 c_i 項,將所有 c_j=0 設定為 j<i,並從以下項構建剩餘項

 c_j=|_Delta/(a_j)_|
(4)

對於 j=i-1, ..., 1 直到 Delta=0 或所有可能性都已用盡。

例如,麥樂雞塊數是隻能使用 (a_1,a_2,a_3)=(6,9,20) 表示的數字。取 n=62 並迭代應用該演算法得到序列 (0, 0, 3), (0, 2, 2), (2, 1, 2), (3, 0, 2), (1, 4, 1),此時 Delta=0。因此 62 是一個麥樂雞塊數,其中

 62=(1·6)+(4·9)+(1·20).
(5)

如果任何 整數 n 可以使用序列 (a_1, a_2, ...) 以 c_i=0 或 1 表示,則此序列稱為完全序列

貪婪演算法也可用於在有限的步驟內將任意分數分解為埃及分數。對於分數 a/b,找到最小的整數 x_1 使得 1/x_1<=a/b,即,

 x_1=[b/a],
(6)

其中 [x]向上取整函式。然後找到最小的整數 x_2 使得 1/x_2<=a/b-1/x_1。迭代直到沒有餘數。對於 1/n2/n,該演算法給出兩個或更少的項;對於 3/n,給出三個或更少的項;對於 4/n,給出四個或更少的項。


參見

硬幣問題, 完全序列, 埃及分數, 弗羅貝尼烏斯方程, 弗羅貝尼烏斯數, 整數關係, 揹包問題, Levine-O'Sullivan 貪婪演算法, 麥樂雞塊數, 反向貪婪演算法, 平方數, 子集和問題, 西爾維斯特序列

使用 探索

參考文獻

Wagon, S. "貪婪硬幣。" http://library.wolfram.com/infocenter/MathSource/5187/

在 上被引用

貪婪演算法

請引用為

Weisstein, Eric W. "貪婪演算法。" 來自 Web 資源。 https://mathworld.tw/GreedyAlgorithm.html

學科分類