基本算法思想note-1

基本算法思想note-1

1.枚举算法思想

将问题的所有可能的答案一一列举,然后根据条件判断此答案是否合适,保留合适的,丢弃不合适的。在C语言中,枚举算法一般使用while 循环实现。枚举算法的基本思路:

  • 确定枚举对象、枚举范围和判定条件。

  • 逐一列举可能的解,验证每个解是否是问题的解。

枚举算法一般步骤:

  • 题解的可能范围,不能遗漏任何一个真正解,也要避免重复解。

  • 判断是否是真正解的方法

  • 使可能解的范围降低至最新,以便提高解决问题的效率。

案例:百鸡百钱问题等。

2.递推算法思想

递推算法的可以不断利用已有的信息推导出新的东西,在日常应用中有如下两种递推算法。

  • 顺推法:从已知条件出发,逐步推出要解决问题的方法。例如斐波那契数列就可以通过顺推法推算出新的数据

  • 逆推法:从已知结果触发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程。

案例:斐波那契数列问题

3.递归算法思想

递归算法思想往往用函数的形式来体现,所以递归算法需要预先编写功能函数。通过调用这些功能函数,可以实现问题的解决。

递归算法基础,递归算法具有如下三个特点:

  • 递归过程一般通过函数或子过程来实现。

  • 递归算法在函数或子过程内部直接或者间接地调用自己的算法,

  • 递归算法实际上是把问题转化为规模缩小的同类问题的子问题,然后在递归调用函数或过程来表示问题的解。

在使用递归算法时,注意以下4点:

  • 递归实在过程或函数中调用自身的过程。

  • 在使用递归策略时,必须有一个明确的递归条件,这称为递归出口。

  • 递归算法通常显得很简洁,但是运行效率较低,所以一般不提倡用递归算法设计程序。

  • 在递归调用过程中,系统用栈来存储每一层的返回点和局部量。如果递归次数过多则容易造成栈溢出,所以一般不提倡递归算法设计程序。

实例:汉诺塔问题

4.分治算法的思想

将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。只要求出子问题的解,就可得到原问题的解,循环这样的模式知道解决问题为止。

分治算法的一般步骤:

  1. 分解,将要解决的问题划分成若干个规模较小的同类问题。

  2. 求解,当子问题划分得足够小时,用比较简单的方法解决。

  3. 合并,按原文的要求,将问题的解逐渐合并构成原问题的解。

实例:大数相乘问题、欧洲冠军杯比赛日程安排

5.贪心算法的思想

贪心算法又称贪婪算法,它在解决问题的时候总想用在当前看来是最好方法来实现。这种算法思想不从整体最优上考虑问题仅仅是在某种意义上的局部最优求解。虽然贪心算法并不能解决所有问题整体最优解,但是在面对范围相当广泛的许多问题时,能产生整体最优解或者是整体最优解的近似解。

贪心算法的基础:贪心算法从问题的某一个初始解出发逐步逼近给定的目的,以便尽快求出更好的解。当达到算法中的某一步不能再继续前进时,就停止算法,给出一个近似解。由于贪心算法的特点和思路可以看出,贪心算法存在以下三个问题:

  • 不能保证最后的解是最优的。

  • 不能用来求最大或者最小问题。

  • 只能满足求某些约束条件下的可行解的范围。

基本思路:

  • 建立数学模型来描述问题。

  • 把求解的问题分成若干个子问题。

  • 对每一个子问题的求解,得到子问题的局部最优解。

  • 把子问题的局部最优解合并成原来问题的一个解。

基本步骤:

  1. 从问题的某一初始解出发

  2. while能向给定总目标前进一步

  3. 求出可行解的一个解元素

  4. 由所有解元素组合成问题的一个可行解

实例:装箱问题

基本算法思想note-1


分享到:


相關文章: