五大算法知识简要整理

一.递归与分治策略

思想:

分而治之; 大规模问题分解成可求解的小问题,把求的解再合并得到最后解;最优子结构:同性质的小问题;

算法框架:
divide-and-conquer(P){
    if(|P|<=n0)
     adhoc(P)  //解决小规模问题;递归出口
     divide P into smaller subinstances P1 P2 P3 ....
     for(i=0;i<=k;i++)
       yi=divide-and-conquer(Pi)
     return merge(y1,y2,..)
}
经典例题:
  1. 递归方法正序打印数组元素
  2. 递归方法逆序打印数组元素
  3. 棋盘覆盖
  4. 最大最小问题
  5. 全排列问题
  6. 求数组的最大元素

二.动态规划

思想:

在分支算法的基础上解决子问题重复的问题
从最小子问题开始求解 自底向上

使用一个表格来保存已求出的解;在求子问题时,先查询表格,避免重复求解

算法框架:
int fib(int n){
   int F[];//辅助表格
   for(){
   //第i次迭代循环
   }
}
经典例题:
  1. 求解二项式系数 (n/m)=n!/[m!(n-m)!]
  2. 0/1背包问题
  3. 最长公共子序列

三.回溯法

思想:

以深度优先的方式搜素解空间树(空间树)

框架:
//递归回溯算法
void backtrack (int n){ //当前搜索层数
if(t>n) output(x);
else
   for(i=f(n,t);i<g(n,t);i++){ //f(n,t)为起始孩子 g(n,t)为结束孩子
    x[t]=h[i];//处于当前层数时 赋值
    if (constraint(t) && bound(t))//用剪枝
       backtrack(t+1)
  }
}

在这里插入图片描述

在这里插入图片描述

经典例题:
  1. 0/1背包问题
  2. 旅行商问题
  3. n皇后问题

四.分支界限法

思想:

以广度优先或者最小耗费优先方式搜索解空间树
两种方法:

队列式 FIFO:先进先出的原则选取下一节点作为扩展节点
优先队列式: 选择优先级最高的节点成为当前的扩展结点
经典例题:

0/1背包问题

五.贪心算法

思想:

最优子结构性质+贪心选择性质
正确性证明:数学归纳法

框架:

在这里插入图片描述
在这里插入图片描述

经典例题:
  1. 活动安排问题
  2. 最优装载
  3. 单源最短路径问题
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值