主题
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 贪婪算法, 麦乐鸡块数, 反向贪婪算法, 平方数, 子集和问题, 西尔维斯特序列

使用 Wolfram|Alpha 探索

参考文献

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

在 Wolfram|Alpha 上被引用

贪婪算法

请引用为

Weisstein, Eric W. "贪婪算法。" 来自 MathWorld--Wolfram Web 资源。 https://mathworld.net.cn/GreedyAlgorithm.html

学科分类