参考代码可见: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> 代码的长度为6,先查看<代码> short_str> 代码是否整个包含在<代码> long_str> 代码中,如果是则返回,如果不是,再将步长设置为5,然后查看<代码> 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)贪心算法