算法面试题
算法的几个特征是什么
- 有穷性: 一个算法必须保证执行有限步之后结束
- 确切性: 算法的每一步骤必须有确切的定义
- 输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件
- 输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的
- 可行性: 算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成
算法复杂性的定义。大O、小o分别表示的含义
小o表示实际的时间复杂度,大O表示时间复杂度。将真实的时间复杂度中的每个式子的常数项设成1,并取多项式中单项最大的那个项,就成了大O
递归算法的定义、递归算法的两要素
定义:一种直接或者间接调用自身的算法
两要素
- 终止条件
- 每次调用的时候,范围会缩小
分治算法的思想,经典的分治算法(全排列、二分搜索、归并排序、快速排序、线性时间选择、最接近点对问题)
分治算法,就是分而治之,将复杂的问题分解成简单的问题进行解决
动态规划算法解题框架,动态规划算法的两个要素是什么?备忘录方法是什么?
动态规划和递归类似,但是用备忘录表示了中间结果,以免重复计算
要素
- 保存中间结果
- 递归关系式
贪心算法的思想,贪心算法的两个要素
- 贪心法,又称贪心算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法
- 贪心算法与动态规划的不同在于它每对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能
- 贪心法可以解决一些最优化问题,如:求图中的最小生成树、求哈夫曼编码……
- 贪心法一般不能得到我们所要求的答案, 一旦一个问题可以通过贪心法来解决,那么贪心法一般是解决这个问题的最好办法。由于贪心法的高效性以及其所求得的答案比较接近最优结果,贪心法也可以用作辅助算法或者直接解决一些要求结果不特别精确的问题。
回溯法的思想,回溯法中有哪两种典型的模型
回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
- 找到一个可能存在的正确的答案
- 在尝试了所有可能的分步方法后宣告该问题没有答案
在最坏的情况下,回溯法会导致一次复杂度为指数时间的计算。
典型应用:八皇后问题
分支限界法思想,有哪两种分支限界法
把全部可行的解空间不断分割为越来越小的子集(称为分支),并为每个子集内的解的值计算一个下界或上界(称为定界)。在每次分支后,对凡是界限超出已知可行解值那些子集不再做进一步分支。这样,解的许多子集(即搜索树上的许多结点)就可以不予考虑了,从而缩小了搜索范围。这一过程一直进行到找出可行解为止,该可行解的值不大于任何子集的界限。因此这种算法一般可以求得最优解。
关键:剪枝,发现当前分支不可能是最优解的时候,则终止当前分支
两种分支界限法
怎样选择搜索树上的节点作为下次分枝的节点呢?有两种方法:
- 从最小下界分枝(优先队列式分枝限界法):每次算完界限后,把搜索树上当前所有叶节点的界限进行比较。找出限界最小的节点,此结点即为下次分枝的结点。
- 优点:检查子问题较少,能较快地求得最佳解;
- 缺点:要存储很多叶节点的界限及对应的耗费矩阵,花费很多内存空间
- 从最新产生的最小下界分枝(队列式(FIFO)分枝限界法):从最新产生的各子集中按顺序选择各结点进行分枝,对于下届比上届还大的节点不进行分枝。
- 优点:节省了空间
- 缺点:需要较多的分枝运算,耗费的时间较多。
参考
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。