常用算法分析与设计

算法设计与分析

  1. P问题,非P类问题,NP问题,NPC问题

    • P问题:如果一个问题可以找到一个能在多项式的时间(n在底数上面)里解决的算法,那么这个问题就是P问题。

    • NP问题:可以在多项式时间里验证一个解的问题。NP问题的另一个定义是,可以在多项式时间里猜出一个解的问题。

    • NPC问题(NP-完全问题):

      存在这样一个NP问题,所有的NP问题都可以规约化为它,换句话说,只要解决了这个问题,那么所有的NP问题就都可以得到解决了。
      1. 他是一个NP问题
      2. 所有的NP问题都可以规约化得到它。
    • NP难问题,只满足NPC的第二个特征,而不满足第一个特征.

    P问题是一个NP问题,但是一个NP问题不一定是一个P问题。因为有NPC问题的存在,是的人们确信P问题 和NP问题不是相等的

    规约:一个问题A可以规约为问题B的含义是,可以用问题B的解法解决问题A。问题B的时间复杂度高于问题A的时间复杂度。

    我们所说的可约化问题指的是在多项时间内,找到一个变化法则,对于人一个程序A的输入,都都能按照程序B的输入,使两个程序的输出相同,那么我们说问题A可以约化为问题B。

    总之,P属于NP,NP属于NPC。

    • NPC问题的例子有:
      • 逻辑电路问题:给定一个逻辑电路,问是否存在一种输入使输出为True.
      • 哈密顿回路问题:
      • 旅行商问题

分治法

  1. 思想

    1.  将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。
    
    2.  divide-and-conquer(P)
    {
        if(|P| <= n0)adhoc(P);
        divide P into samller subinstances P1,P2...,Pk;
        for(int i = 1;i < k;i++)
        {
            yi = divide-and-conquer(Pi);
        }
        return merge(y1,y2...,yn);
    }
    3.如何划分子问题
    -   集合论,找到一个原来集合问题的一个划分,子问题之间不相交,同时子问题的规模类型相同
    -   最优子结构(子问题类型相同)
    -   最好使子问题的规模大致相同,即将一个问题的大小分成相等规模的k个子问题的处理方法是行之有效的。
  2. 例子

    1.  fibonacci 数列        
    2.  排列问题
    3.  整数划分问题
    4.  Hanoi 塔问题
    5.  二分搜索
    6.  大整数乘法
    7.  Strassen 矩阵乘法
    8.  合并排序
    9.  快速排序
  3. 复杂度分析

    主定理:T(n) = aT(n/b)+f(n),a>=1,b>1,f(n)是给定的多项式函数,刻画了一个分值算法,生成a个子问题,每个问题的规模是原来的1/b,分解合并步骤共消耗f(n). T(n)的复杂度的分析如下:
    1.  若f(n)<n^(log(a/b)) 则T(n) = n^(log(a/b))
    2.  若f(n)=n^(log(a/b)) 则T(n) = n^(log(a/b))logn
    3.  若f(n)>n^(log(a/b)) 则T(n) = f(n)

动态规划

  1. 思想

    用一个表来记录所有以解决问题子问题的答案,不管该子问题以后是否会用到,只要它被计算过,就将其结果存入到表中,这就是动态规划法的基本思想。
    基本要素:
    1. 最优子结构:当一个问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
    2. 重叠子问题: 在使用递归算法的时候有很多子问题是重叠的,那么我们使用一个表将已经求解过的子问题的结果保存下来
    备忘录方法
    1. 与动态规划一样:备忘录方法也是使用一张表来保存子问题的答案,下次需要解此子问题的时候,我们只需要简单查看该子问题的答案即可,而不是重新计
    算。
    2. 与动态规划不同:备忘录方法的递归方式是自顶向下的,而动态规划是自底向上的。 备忘录方法与直接控制的递归结构是相同的,但是他不用重复求解相同子问题。
    3. 当一个问题的所有子问题都要至少解一次时,使用动态规划算法比备忘录方法好。 当子问题空间中部分子问题不必求解时,用备忘录方法则较为有利,备忘录方法只用来求解那些需要求解的子问题。
  2. 基本步骤
    1. 找出最优解的性质,并刻画其结构特征
    2. 递归地定义最优值
    3. 以自底向上的方式计算出最优值
    4. 根据计算最优值时得到的信息,构造最优解
  3. 例子
    1. 矩阵连乘
    2. 最长公共子序列
    3. 0-1背包问题

贪心算法

  1. 思想

    贪心算法总是做出当前看来最好的选择,也就是说贪心算法并不从整体最优考虑,它做出的选择只是在某种意义上的局部最优选择。
    贪心选择的基本要素:
    1.  贪心选择性质: 所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
    2.  最优子结构: 一个问题的最优解包含其子问题的最优解时,此问题具有最优子结构性质
  2. 贪心算法VS动态规划

    1.  贪心算法拥有贪心选择性质,动态化算法没有。动态规划算法中,每步所作出的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能作出选择; 而贪心算法中,仅在当前状态下作出最好选择,即局部最优选择。然后去解作出这个选择后产生相应的子问题。 贪心选择依赖于过往所做选择,但是不以利于将来将要作出的选择,也不依赖于子问题的解。
    2. 动态规划算法通常以自底向上的方式解各子问题,贪心算法则是自顶向下方式迭代进行贪心选择,每一次贪心选择将所求问题简化为规模更小的子问题
  3. 例子

    1. 活动安排问题 (最早截止时间优先)
    2. 背包问题 (权重空间比值最大者优先)
    3. 哈夫曼编码 (频率大者优先)
    4. 单源最短路径 (局部最短路径优先)
    5. 最小生成树
        -prim (与源集合相连的权值最小边优先)
        -kruskal-(集合中边权值最小优先)
    6.  多级调度问题(长作业优先)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值