野生前端的数据结构练习(12)贪心算法

  

野生前端的数据结构练习(12)贪心算法

  
  

参考代码可见:https://github.com/dashnowords/blogs/tree/master/Structure/GreedyAlogrithm

     

一。贪心算法

  

<代码>贪心算法> 全局最优强。在很多实际问题中,寻找全局最优解的代价是非常大的,这时候就可以通过求次优解来解决问题,这种思想其实在软件工程中很常见,例如<代码> 反应中著名的DOM Diff <代码> 算法中需要对比两棵DOM树,树的完全对比时间复杂度为<强> O (n ^ 3) 强,而反应团队通过只比较同层节点的策略将问题简化为<强> O (n) 强,也就是说得到的结果从全局角度来说并不一定是绝对最优的,但是它可以在大多数情况下表现并不差。

  

下面通过几个简单例子来理解<代码>贪心算法> 《数据结构与算法Javascript描述》一书)。

  

二。贪心算法求解背包问题

  

贪心算法求解背包问题实际上很像人工求解,如果你是一个大盗,自己带着背包在宝库挑东西,总不能拿一张草稿纸出来开始动态规划或手动递归吧,那等你求出结果来估计警察也来了,可能的做法例如:

  
      <李>不做衡量,拿起什么放什么,放不进去或者没有更多东西了,然后离开。   <李>从最贵的开始挑,能放进去就放,放不进去就接着挑别的,最后背包塞不下更多或者没东西了,然后离开。   <李>简单计算一下性价比(一般可以以【价值】/咎寤坷春饬?,然后按性价比从高到低开始挑,能放进去就放,放不进去就下一个,最后背包塞不下更多或者没东西了,离开。   
  

这几种方式都可以作为贪心算法的一部分参与计算,得到的结果也不一定是一样的,但都可以认为是一种局部最优解,同时也可能是全局最优解。

  

示例算法实现:

  
 <代码类=" language-js ">/* *
  *贪心算法求解背包问题局部最优解
  */函数ksack(价值观、重量、容量、n) {
  var负荷=0;
  var=0;
  var w=0;
  而(负载& lt;能力,,我& lt;n) {
  如果(重量[我]& lt;=(满载)){
  w +=值[我];
  负载+=重量(我);
  其他}{
  var r=(能力-负载)/重量(我);
  w +=r *值[我];
  负载+=重量(我);
  }
  我+ +;
  }
  返回w;
  }
  
  var=项目(“A”、“B”、“C”,“D”);
  var值=(140、60、60);
  var权重=(5、20、10、12);
  var n=4;
  var=30能力;
  
  控制台。日志(ksack(价值观、重量、容量、n))  
  

三。最长公共子串

  

<强>书中第14章练习题1:使用暴力技巧求解最长公共子串

  

<强> 3.1题解:

  

暴力求解公共字符串的方法,从较短的字符串整体开始找起,逐步缩小步长,例如长字符串为<代码> long_str> short_str> short_str> short_str> long_str> short_str[0 5) ,<代码> short_str(1,6) 这两个字符串是否在<代码> long_str>   

<强> 3.2参考代码:

  
 <代码类=" language-js ">/* *
  *贪心算法寻找公共子串
  */函数greedy_lsc (str1 str2) {//保证str2是长度较短的序列
  如果(str1。长度& lt;str2.length) {
  让temp=str1;
  str1=str2;
  str2=temp;
  }
  让stepLength=str2.length;//从长到短枚举
  而(stepLength祝辞=0){
  (让我=0;我& lt;str2。长度- stepLength;我+ +){//相当于拿一个不断缩短的尺子逐段截取来查看截取的片段是否被长字符串包含,//一旦找到则就是最长公共子串
  我们检查=str2。片(我+ stepLength);
  如果(包含(str1,检查)){
  返回检查;
  }
  }
  stepLength——;
  }
  }//str2是否是str1的子串
  函数包含(str1 str2) {
  返回str1.indexOf (str2) !==1;
  }//测试
  让str1=癮abcdefsssefce”;
  让str2=癮bssefsssse”;
  
  console.log (greedy_lsc (str1 str2));  
  

四。找零问题

  

<强>书中第14章练习题3:使用贪心算法求解找零问题,要求不能美用10分,需要找30美零分。

野生前端的数据结构练习(12)贪心算法