文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

面试官:说说你对贪心算法、回溯算法的理解?应用场景?

2024-12-02 19:44

关注

一、贪心算法

贪心算法,又称贪婪算法,是算法设计中的一种思想

其期待每一个阶段都是局部最优的选择,从而达到全局最优,但是结果并不一定是最优的

举个零钱兑换的例子,如果你有1元、2元、5元的钱币数张,用于兑换一定的金额,但是要求兑换的钱币张数最少

如果现在你要兑换11元,按照贪心算法的思想,先选择面额最大的5元钱币进行兑换,那么就得到11 = 5 + 5 + 1 的选择,这种情况是最优的

但是如果你手上钱币的面额为1、3、4,想要兑换6元,按照贪心算法的思路,我们会 6 = 4 + 1 + 1这样选择,这种情况结果就不是最优的选择

从上面例子可以看到,贪心算法存在一些弊端,使用到贪心算法的场景,都会存在一个特性:

一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法

至于是否选择贪心算法,主要看是否有如下两大特性:

二、回溯算法

回溯算法,也是算法设计中的一种思想,是一种渐进式寻找并构建问题解决方式的策略

回溯算法会先从一个可能的工作开始解决问题,如果不行,就回溯并选择另一个动作,知道将问题解决

使用回溯算法的问题,有如下特性:

常见的伪代码如下:

  1. result = [] 
  2. function backtrack(路径, 选择列表): 
  3.   if 满足结束条件: 
  4.     result.add(路径) 
  5.   return 
  6.  
  7.   for 选择 of 选择列表: 
  8.     做选择 
  9.     backtrack(路径, 选择列表) 
  10.     撤销选择 

重点解决三个问题:

例如经典使用回溯算法为解决全排列的问题,如下:

一个不含重复数字的数组 nums ,我们要返回其所有可能的全排列,解决这个问题的思路是:

用代码表示则如下:

  1. var permute = function(nums) { 
  2.     const res = [], path = []; 
  3.     backtracking(nums, nums.length, []); 
  4.     return res; 
  5.      
  6.     function backtracking(n, k, used) { 
  7.         if(path.length === k) { 
  8.             res.push(Array.from(path)); 
  9.             return
  10.         } 
  11.         for (let i = 0; i < k; i++ ) { 
  12.             if(used[i]) continue
  13.             path.push(n[i]); 
  14.             used[i] = true; // 同支 
  15.             backtracking(n, k, used); 
  16.             path.pop(); 
  17.             used[i] = false
  18.         } 
  19.     } 
  20. }; 

三、总结

前面也初步了解到分而治之、动态规划,现在再了解到贪心算法、回溯算法

其中关于分而治之、动态规划、贪心策略三者的求解思路如下:

其中三者对应的经典问题如下图:

 

参考文献

https://zh.wikipedia.org/wiki/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95

https://leetcode-cn.com/problems/permutations/solution/dai-ma-sui-xiang-lu-dai-ni-xue-tou-hui-s-mfrp/

https://cloud.tencent.com/developer/article/1767046

 

来源:JS每日一题内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯