枚举所有的可能,从所有候选答案中搜索正确的解
一般使用while循环或者if语句实现
最大特点:在面对问题时会去尝试每一种解决方法
重复性的将问题分解为同类的子问题,然后解决这些子问题,最终完整解决问题
和平常用到的递归函数类似,是一种直接或者间接的调用自身函数或者方法的算法
递推像是多米诺骨牌,根据前面几个得到后面的
递归是大事化小,将复杂的问题层层转化为同类简单子问题
一个问题既可以用递推解决也可以用递归解决的时候,选择递推算法,因为递推的效率比递归高
分而治之,把一个复杂的问题分解成两个或者更多的相同或者相似的问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解就是子问题的解的合并
处理数据相当多、求解过程比较复杂、直接求解法会比较耗时
将一个难以直接解决的大问题,分割成一些规模较小的相同或相似问题,以便各个击破,分而治之
重点解决以下2个问题:
编写涉及数组的递归函数时,基线条件通常情况下都是数组为空或者只包含一个元素。编程陷入困境时,可以检查基线条件设置的是否正确
2.确定如何缩小问题的规模,然后不断将问题分解为更小的问题,直到符合基线条件
在求解一个问题时,总是做出在当前看来是最好的选择(即只是得出一个在局部某种意义上的最优解),不从整体最优方面考虑问题
核心是贪心策略的选择,必须确保选择的贪心策略无后效性,即某个状态以前的过程不会影响以后的状态,只是与当前的状态有关
从问题的某一个初始解出发逐渐逼近给定的目标值,这样可以尽快求出更好的解。当达到算法中的某一步不能再继续前进时,就停止运行并给出一个近似解
是一种通过暴力穷举的方式解决问题的算法,是深度优先搜索的一种具体应用
适合解决没有要求求最优解的问题,如果采用,一定要注意跳出条件及搜索完成的标志,否则会陷入泥潭不可自拔
先暂时放弃关于问题规模大小的限制,并将问题的候选解按照某种顺序逐一进行枚举和检验:
回溯算法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已经被搜索一遍才结束
回溯算法在用来求问题的任意解时,只要搜索到问题的一个解就可以结束
回溯算法为了求得问题的正确解,会先委婉地试探某一种可能的情况,在进行试探的过程中一旦发现原来选择的假设情况是不正确的,立即会自觉的退回一步重新选择,然后继续向前试探,如此这般反复进行,直到得到解或证明无解时才放弃
回溯算法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
是一种不断用变量的旧值递推新值的过程,可以将迭代算法分为两种:精确迭代和近似迭代(比如二分法、牛顿迭代法)
1)所需的迭代次数是个确定的值,可以计算出来,可以构建一个固定次数的循环来实现对迭代过程的控制
2)所需的迭代次数无法确定,需要进一步分析出用来结束迭代过程的条件
递归是自顶向下逐步拓展需求,最后自下向顶运算,即由f(n)拓展到f(1),再由f(1)逐步算回f(n);递归是在函数内调用本身
迭代是直接自下向顶运算,由f(1)逐步算回f(n);迭代是循环求值
在大量的信息中寻找一个特定的信息元素
基本运算是在关键字之间进行比较
可用平均查找长度来衡量查找算法的性能
现实场景中,用到查找算法的效率非常高
解决问题时遵循具体情况具体对待的原则,不要一味追求使用最高效率的算法
建议初学者尽量用多种查找算法来解决同一个问题,这样可以比较不同查找算法的效率,并能深入体会不同算法的思想精髓
针对一连串数据,按照其中的某个或者某些关键字的大小,以递增或者递减的样式排列起来的操作
目的是将一组无序的记录序列调整为有序的记录序列,可分为内部排序和外部排序
首先要求其具有一定的稳定性,即当2个相同的元素同时出现于某个序列之中,经过一定的排序算法之后,两者在排序前后的相对位置不发生变化
通过特定的算法因式将一组或者多组数据按照既定模式进行重新排序