五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

这篇具有很好参考价值的文章主要介绍了五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

(1) 分治法

将一个难以直接解决的大问题,分割成一些规模较小的相同问题

五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

快速排序
快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面,
然后递归分治求解两个子区间,当然快排因为在分的时候就做了很多工作,
当全部分到最底层的时候这个序列的值就是排序完的值。这是一种分而治之的体现。

五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

public void quicksort(int [] a,int left,int right){ 
  int low=left; 
  int high=right; //下面两句的顺序一定不能混,否则会产生数组越界!!!  very important!!! 
  if(low>high)//作为判断是否截止条件 
  return; 
  int k=a[low];//额外空间k,取最左侧的一个作为衡量,最后要求左侧都比它小,右侧都比它大。 
  while(low<high)//这一轮要求把左侧小于a[low],右侧大于a[low]。 
  { 
  while(low<high&&a[high]>=k)//右侧找到第一个小于k的停止 
  { high--; } //这样就找到第一个比它小的了 
  a[low]=a[high];//放到low位置 
  while(low<high&&a[low]<=k)//在low往右找到第一个大于k的,放到右侧a[high]位置 
  { low++; } 
  a[high]=a[low];
  } 
  a[low]=k;//赋值然后左右递归分治求之 
  quicksort(a, left, low-1); 
  quicksort(a, low+1, right); 
}

归并排序(逆序数)
快排在分的时候做了很多工作,而归并就是相反,归并在分的时候按照数量均匀分,
而合并时候已经是两两有序的进行合并的,因为两个有序序列O(n)级别的复杂度即可得到需要的结果。
而逆序数在归并排序基础上变形同样也是分治思想求解。
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法


private static void mergesort(int[] array, int left, int right) { 
  int mid=(left+right)/2; 
  if(left<right) { 
    mergesort(array, left, mid); 
    mergesort(array, mid+1, right); 
    merge(array, left,mid, right); 
    }
}
private static void merge(int[] array, int l, int mid, int r) { 
  int lindex=l;
  int rindex=mid+1; 
  int team[]=new int[r-l+1]; 
  int teamindex=0; 
  while (lindex<=mid&&rindex<=r) {//先左右比较合并 
    if(array[lindex]<=array[rindex]) { 
      team[teamindex++]=array[lindex++]; 
    } else { 
      team[teamindex++]=array[rindex++]; 
    } 
  } 
  while(lindex<=mid)//当一个越界后剩余按序列添加即可 
  { team[teamindex++]=array[lindex++]; } 
  while(rindex<=r) { team[teamindex++]=array[rindex++]; } 
  for(int i=0;i<teamindex;i++) { array[l+i]=team[i]; }
}

(2) 动态规划

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题。

【初始状态】→【决策1】→【决策2】→…→【决策n】→【结束状态】

常见的应用场景有以下几个:

0-1背包问题( ✔️)
矩阵连乘法( ✔️)
硬币找零
字符串相似度
最长公共子序列
最长递增子序列
最大连续子序列和/积
有代价的最短路径
瓷砖覆盖(状态压缩DP)
工作量划分

    var value = [ 0, 1500, 3000, 2000]//分别对应物品a,b,c,为了方便人机交互,定义第0个物品为0
    var weight = [ 0, 1, 4, 3]//分别对应物品a,b,c,为了方便人机交互,定义第0个物品为0
    var bag = 4;//背包容量
    console.log('背包容量', re_OPT(3, 4))
    re_OPT(3, 4)

    /**
     * 动态规划:递归来求最优解
     * @param n 第n个物品
     * @param bag 背包容量
     * @return 最优解
     */
    function re_OPT(n, bag) {
      if (n == 0) {
        return 0;
      }
      if (bag >= weight[n]) {
        return Math.max(value[n] + re_OPT(n - 1, bag - weight[n]), re_OPT(n - 1, bag));
      } else {
        return re_OPT(n - 1, bag);
      }
    }

五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

递归式实现了,仍然存在有个小问题。包含了大量的重复计算,极易引发栈溢出。

解法2,非递归实现动态规划算法
最终的答案,就在二维数组的右下角。
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

var value = [0, 1500, 3000, 2000]//分别对应物品a,b,c,为了方便人机交互,定义第0个物品为0
    var weight = [0, 1, 4, 3]//分别对应物品a,b,c,为了方便人机交互,定义第0个物品为0
    var bag = 4;//背包容量
    /**
 * 动态规划:非递归求最优解
 * @param n 第n个物品
 * @param bag 背包容量
 * @return 最优解
 */
    function dp_OPT(n, bag) {
      var result = []
      //将第一行与第一列重置为0
      for (var i = 0; i < weight.length; i++) {
        result[i] = [];
        for (var j = 1; j < bag + 1; j++) {
          result[i][j] = []
        }
      }
      //创造一个二维数组,用来存放各种情况对应的最优解,前[]保存第几个物品,后面[]保存多少背包容量
      for (var i = 0; i < result[0].length; i++) {
        result[0][i] = 0;
      }
      for (var j = 0; j < result.length; j++) {
        result[j][0] = 0;
      }
      for (var i = 1; i < result.length; i++) {
        for (var j = 1; j < result[0].length; j++) {
          result[i][j] = j >= weight[i] ? Math.max(value[i] + result[i - 1][j - weight[i]], result[i - 1][j]) : result[i - 1][j];
        }
      }
      return result[n][bag];
    }

五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

(3) 回溯法

深度优先的方式系统地搜索问题的解的方法称为回溯法。
可以系统地搜索一个问题的所有解或任意解。
有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。
回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
https://blog.csdn.net/weixin_44705732/article/details/102650666

(4) 分支界限法

分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

(5) 贪心算法

把求解的问题分成若干个子问题
对每个子问题求解,得到子问题的局部最优解
把子问题的解局部最优解合成原来问题的一个解

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

实际上,贪心算法适用的情况很少。

有三个物品A,B,C,其重量分别为{20,30,10},价值分别为{60,120,50},背包的容量为50,分别应用三种贪心策略装入背包的物品和获得的价值如下图所示:
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法
五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

分治法——>分成若干个子问题,例如“排序”。

动态规划——>分成若干个子问题,找出最优解。

贪心算法——>分成若干个子问题,局部最优解,不是最优解,不能用来求最大值或最小值的问题。

回溯法——>深度优先 遍历结点搜索解空间树。找出所有解。

分支限界法——>广度优先或最小耗费优先搜索解空间树。找出最优解。文章来源地址https://www.toymoban.com/news/detail-444384.html

到了这里,关于五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心

    1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解, 然后综合各个小问题,得到最终答案。 2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。 3、迭代法(Iterative Method) 无法使用公式一次求解,而需要使用重复结构

    2024年02月08日
    浏览(45)
  • 四大算法:贪心、分治、回溯、动态规划

    贪心算法(又称贪婪算法),在求解问题时,总是做出在当前看来是最好的选择。也就是说,不从整体最优解进行考虑,而是得到某种意义上的局部最优解。 贪心算法采用自顶向下,以迭代的方法做出贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的问题。

    2024年02月15日
    浏览(65)
  • (软考-软件设计师.下午)动态规划算法、回溯算法、贪心算法、分治算法的应用

    :【递归技术】【二分查找】 分治法的设计思路: 将一个难以直接解决的 大问题 分解成一些 规模较小 的相同问题以便于 逐个击破,分而治之 。      由代码可以看出二分查找也属于分治法的一种,关于二分查找,这位博主总结的很详细。  :【查表】   动

    2024年02月06日
    浏览(78)
  • 算法分析与设计考前冲刺 (算法基础、数据结构与STL、递归和分治、 动态规划、贪心算法、 回溯算法)

    算法分析与设计考前冲刺 算法基础 算法是一系列解决问题的清晰指令,代表着用系统的方法描述解决问题的策略机制。 程序是算法用某种程序设计语言的具体的 具体实现 算法特征: 有穷性(有限步) 确定性 输入 输出 可行性(有限时间) 算法的复杂性: 时间复杂性 和空间复

    2024年02月02日
    浏览(44)
  • 01背包(动态规划,贪心算法,回溯法,分支限界法)

    有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和? number=4,capacity=8 物品编号(i) W(体积) V(价值) 1 2 3 2 3 4 3 4 5 4 5 6 1.什么是动态规划 1.动态规划算法是通过拆分问题,定义问题状态和状态之间的关系, 使得

    2024年02月08日
    浏览(68)
  • java实现0-1背包问题方案(动态规划-贪心算法-回溯-分支定界)

    动态规划算法时间复杂度较低,能够求解较大规模的问题,但空间复杂度较高,不适用于数据量较大的问题。 贪心算法时间复杂度较低,能够求解较大规模的问题,但不能保证求得的解是最优解。 回溯算法能够求解较小规模的问题,但时间复杂度较高,不适用于数据量较大

    2024年02月01日
    浏览(130)
  • LeeCode——回溯法、动态规划、贪心法、分治法(快速说明)

    算法方法 用处 优点 缺点 拓展与改良 回溯法 适用于求解组合问题、排列问题、搜索问题等。 1. 可以搜索整个解空间,找到最优解。 2. 不需要预先知道问题的解可能在哪里。 1. 时间复杂度高,因为需要遍历整个解空间。 2. 需要较大的空间存储搜索轨迹。 1. 剪枝优化。 2. 双

    2024年02月10日
    浏览(86)
  • 回溯法,分支限界法,动态规划法求解0-1背包问题(c++)

    问题描述 给定n种物品和一背包。物品i的重量是wi0,其价值为vi0,背包的容量为c。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 搜索空间: 子集树(完全二叉树) 约束函数(进包用): 如果当前背包中的物品总重量是cw,前面k-1件物品都已经决定是否进包,那

    2024年02月10日
    浏览(58)
  • 算法分析与设计---分治+动态规划

    1.分治法 适用条件: 问题规模缩小到一定程度容易求解 问题可以分解为若干个规模较小的 相同 子问题,即问题具有最优子结构( 使用分治法前提 ) 可以利用子问题的解合并为该问题的解( 决定是否使用分治法 ) 各个子问题 相互独立 ,即子问题之间不包含公共子问题(

    2024年02月07日
    浏览(45)
  • 探索经典算法:贪心、分治、动态规划等

    贪心算法是一种常见的算法范式,通常在解决最优化问题中使用。 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法范式。其核心思想是选择每一步的最佳解决方案,以期望达到最终的全局最优解。这种算法特点在于只考虑局部最优解,而不会回溯或重新考虑

    2024年02月05日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包