贪心策略

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解

贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须注意的是,贪心算法不是对所有问题都能得到整体最优解,选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。

所以对所采用的贪心策略一定要仔细分析其是否满足无后效性


贪心算法的基本要素

  • 贪心选择性质

    所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。

    动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。

    对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

  • 最优子结构性质

    一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征

【例 】给出 n n n 个开区间 ( x , y ) (x,y) (x,y),从中选择尽可能多的开区间,使得这些开区间两两没有交集.
例如对开区间 ( 1 , 3 ) (1,3) (1,3) ( 2 , 4 ) (2,4) (2,4) ( 3 , 5 ) (3,5) (3,5) ( 6 , 7 ) (6,7) (6,7).

【解】

F ( n ) F(n) F(n) 表示 n n n 个开区间的最大不相交区间,那么根据贪心策略,逐步局部最优得到最终结果,我们可以得到:
F ( n ) = F ( n − 1 ) + l n F(n)=F(n-1)+l_n F(n)=F(n1)+ln

其中, l n l_n ln 表示第 n n n 步选择的区间.

那么第 n n n 步选择哪个区间呢?有三种情况, l n l_n ln 加到已选区间的最左边,最右边以及已选区间的中间.

显然, l n l_n ln 不能插入已选区间的中间,因为你的同时判断 l n l_n ln 的起始端和中间端与已有区间的关系,问题较为复杂,所以我们应该选择的 l n l_n ln 是直接插入已选区间对的一边.

也就是说,当 l n l_n ln 是插入到 F ( n − 1 ) F(n-1) F(n1) 的左边时,选择的是结束最早的区间段;当 l n l_n ln 是插入到 F ( n − 1 ) F(n-1) F(n1) 的右边时,选择的是开始最晚的区间段.

以每步选择开始最晚的区间段为例,它的边界条件是啥呢?显然, l n − 1 l_{n-1} ln1 的结束端不能大于 l n l_n ln 的起始端.

按照这个算法,该例可以用如下步骤解决:
F ( 4 ) = F ( 3 ) + l 4 = F ( 2 ) + l 3 + l 4 = l 1 + l 3 + l 4 F(4)=F(3)+l_4=F(2)+l_3+l_4=l_1+l_3+l_4 F(4)=F(3)+l4=F(2)+l3+l4=l1+l3+l4

贪心策略适用范围并不是很广,在使用时一定要进行贪心策略的正确性证明!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据引用[1]的论证,贪心策略在生成哈夫曼树时具备贪心选择性质和最优子结构性质。哈夫曼编码是一种变长编码,它通过使用不同长度的编码来表示不同的字符,从而有效减少表示同一字符集所需的编码长度,提升编码效率。同时,为了保证编码的唯一性和解码的准确性,哈夫曼编码要求任一字符的代码都不是其他字符代码的前缀,即采用前缀码的方式进行编码。 下面是一个演示贪心策略和哈夫曼编码的例子: 假设有一个字符集合,其中包含4个字符:A、B、C和D,它们的出现频率分别为2、3、4和5。我们可以使用贪心策略生成哈夫曼树,并根据哈夫曼树生成对应的哈夫曼编码。 首先,根据字符的频率构建4个叶子节点,并将它们放入一个优先队列中。然后,重复以下步骤直到队列中只剩下一个节点: 1. 从队列中取出频率最小的两个节点作为左右子节点,构建一个新的内部节点。 2. 将新的内部节点放回队列中。 最终,队列中只剩下一个节点,即为生成的哈夫曼树的根节点。 接下来,根据生成的哈夫曼树,可以得到每个字符对应的哈夫曼编码。从根节点开始,向左走为0,向右走为1,直到达到叶子节点。每个叶子节点的路径即为该字符的哈夫曼编码。 对于上述例子,生成的哈夫曼树如下所示: ``` 14 / \ 7 7 / \ / \ A B C D ``` 根据哈夫曼树,可以得到每个字符的哈夫曼编码: A: 00 B: 01 C: 10 D: 11 因此,根据贪心策略生成的哈夫曼树所对应的编码为最优前缀码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值