贪心算法

来源:互联网 发布:量子纠缠知乎 编辑:程序博客网 时间:2024/06/03 16:03

贪心算法是通过一系列的选择来得到问题的解。它所做的选择都是在当前状态下局部最优选择,即贪心选择。这种启发式的策略并不总是有效,但能够奏效的时候能够达到预期目标。能够使用贪心选择解决的问题一般有两个重要的性质:贪心选择性质和最优子结构性质。

贪心选择性质是指所求问题的整体最优解可以通过一系列局部的最优选择(贪心选择)来实现。贪心选择是立足于当前已有的选择的接下来将要进行的下一步选择。动态规划的选择却需要依赖于将来的选择。

最优子结构性质是指问题的最优解包含子问题的最优解,子问题是指比原问题规模小的问题并被包含在园问题中。


贪心算法的理论基础--拟阵

拟阵的定义

拟阵M定义满足下面三个条件的有序对(S,I):

a:S是非空有限集

b:I是S的一类具有遗传性质的独立子集族,即若B是I的子集,则B是S的独立子集,且B的任意子集也是S的独立子集族。空集必为I的成员。

c:I满足交换性质。即若A是I的子集,B是I的子集,并且|A|<|B|,则存在某一个元素x属于B-A,使得A并{x}也是I的子集。

拟阵的定义由很多种,有矩阵的秩来定义的,图形定义的,集合定义的等等。不过定义的数学性质是一样的。

定理:拟阵M中所有极大独立子集具有相同大小。


贪心算法的拟阵定义形式:

template <class Type> Type Greedy(M,W){    A={};    sort S by W as array;    while(S非空){          S.DeleteMax(x);          if(A并{x}属于I)A=A并{x};     }       return A;}

解释:M=(S,I); W是权函数。贪心算法的关键要素:S是问题的解存在范围的集合,I通常是S中极大独立子集族,W是贪心问题的决策函数或者决策数据。A是恒定满足问题解的集合,可能是空集也可能不是。A依靠拟阵的交换性质不断的检验权函数决策出的元素x,符合条件则加入A,这样不断的扩充解空间,直到A成为M的极大独立子集。

Note:权函数的决策性质可以看出,它具有可排序的线性性质,这个极大的区别于动态规划。动态规划是多个条件形成的非线性性质。

 

根据上面的整理信息,可以得到采用贪心算法的特征:

1:具有线性的权序列,并且可以对权序列进行排序

2:问题的性质符合拟阵的特性。对着拟阵的定义可以验证通过。


请不要对比贪心算法和动态规划比较不同,这两个的数学模型的性质是不一样的。在内核都不要的情况下去比较外貌是非常不可取的。


0 0