zoukankan      html  css  js  c++  java
  • 贪心算法

    贪心算法

    一、基本概念

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

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

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

    如图:

    我来举一个例子。在一个有权图中,我们从顶点 S 开始,找一条到顶点 T 的最短路径(路径中边的权值和最小)。贪心算法的解决思路是,每次都选择一条跟当前顶点相连的权最小的边,直到找到顶点 T。按照这种思路,我们求出的最短路径是 S->A->E->T,路径长度是 1+4+4=9。

    很明显,这不是最短路径,最短路径是S->B->D->T

    二、基本思路

    • 建立数学模型来描述问题
    • 把求解的问题分成若干个子问题
    • 对每个子问题求解,得到子问题的局部最优解
    • 把子问题的解局部最优解合成原来问题的一个解

    三、该算法存在的问题

    • 不能保证求得的最后解是最佳的
    • 不能用来求最大值或最小值的问题
    • 只能求满足某些约束条件的可行解的范围

    四、贪心算法适用的问题

    贪心策略适用的前提是:局部最优策略能导致产生全局最优解。
    实际上,贪心算法适用的情况很少。一般对一个问题分析是否适用于贪心算法,可以先选择该问题下的几个实际数据进行分析,就可以做出判断。

    五、贪心选择性质

    所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,换句话说,当考虑做何种选择的时候,我们只考虑对当前问题最佳的选择而不考虑子问题的结果。这是贪心算法可行的第一个基本要素。贪心算法以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。
    当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心算法求解的关键特征。

    六、贪心算法的实现框架

    从问题的某一初始解出发:

    while (朝给定总目标前进一步)
    {
    利用可行的决策,求出可行解的一个解元素。
    }
    由所有解元素组合成问题的一个可行解;

    更多详情:https://www.jianshu.com/p/ab89df9759c8

              https://blog.csdn.net/liushengxi_root/article/details/86676382

     



  • 相关阅读:
    学习日记-- 动态性。动态编译,静态方法,包装类
    第一周学习所获———ORM,数据持久化,通过注解来实现数据持久化框架
    第一周学习所获--class类1(反射和类加载过程)
    各种命名规范
    用easyui,json,纯mvc实现一个系统的数据流动过程
    js+bootstrap实现分页页码
    Echarts简单案例
    bootstrap日期控件(双日期、清空等问题解决)
    三种方法实现调用Restful接口
    Spring MVC异常处理 和 重定向传递数据
  • 原文地址:https://www.cnblogs.com/mvpbest/p/13389179.html
Copyright © 2011-2022 走看看