算法常用概念解释

递归函数

递归函数是一种可以调用自身的函数,每次成功的调用都使得输入变得更加精细,使我们越来越接近问题的答案。 递归又分为:基本递归和尾递归。

递归过程分为两个阶段: 递推阶段  和  回归阶段。 比如,计算n的阶乘的时候,终止条件是当n=0和n=1,此时函数简单的返回1即可。每个递归函数都必须拥有至少一个终止条件,否则,递推就永远无法结束了。一旦递推结束就进入回归阶段,在这之前的函数调用以逆序方式回归,直到最初调用的函数返回为止。(栈的思想)

当n=0,1 时,F(n) = 1  ;  当n>1时 ,F(n)  = n * F(n-1)  (递推公式)

实现代码如下:

算法常用概念解释_第1张图片

为了理解递归究竟是如何工作的,下面看一下关于C程序在内存中的组织方式。一般一个可执行的程序由4个区域组成:代码段、静态数据区、堆和栈。当C程序中调用了一个函数时,栈会分配一块空间来保存与这个调用相关的信息。每一个调用都被当做活跃的。栈上的那块存储空间称为活跃记录,或者称为栈帧。 栈帧由5个区域组成:输入参数、返回值空间、计算表达式时用到的临时存储空间、函数调用时保存的状态信息以及输出参数。

算法常用概念解释_第2张图片

栈是用来存储函数调用信息的绝好方案,这正是由于其后进先出的特点精确满足了函数调用和返回的顺序。然而栈也有缺点,栈维护了每个函数调用的信息知道函数返回后,才释放,这需要相当大的空间,尤其在程序中使用了许多递归的调用的情况。 

但是我们可以采用一种尾递归的方式来避免前面提到的缺点。

同样以n的阶乘为例,其递推公式为 : 初始a=1 ,  当n=0,1 时,返回a; 当n > 1时,F(n,a) = F(n-1,na) ,当递推到n=1时,返回的a即是最终的结果,无需再回归。

分治法

分治法是将问题划分成一些独立的子问题,递归求解各子问题,然后合并子问题的解而得到原问题的解。

动态规划算法

和分治法一样,动态规划(dynamic programming) 是通过组合子问题的解而解决整个问题的。动态规划与分治法不同,动态规划是适用于子问题不是独立的情况,也就是各子问题包含公共的子问题。在这种情况下,若用分治法则会做许多不必要的工作,即会重复的求解公共的子子问题。动态规划算法对每个子子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案。

  动态规划算法应用于最优化问题,此类问题可能有很多种可行解。每个解有一个值,而我们希望找出一个具有最优(最大或最小)值的解。称这样的解为该问题的“一个”最优解,而不是确定的最优解,因为可能存在多个取最优值的解。

 动态规划算法的设计可以分为4个步骤:

1.描述最优解的结构

2. 递归定义最优解的值

3. 按底向上的方式计算最优解的值

4. 由计算出的结果构造一个最优解

第1~3步构成问题的动态规划解的基础。第4步在只要求计算最优解的值可以略去。如果的确做了第四步,则有时要在第3步的计算中记录一些附加信息,使构造一个最优解变得容易。

动态规划中三个重要概念:“最优子结构”  “边界”   “ 状态转移方程”

贪心算法

适用于最优化问题的算法往往包含一系列步骤,每一步都有一组选择。对许多最优化问题来说,采用动态规划方法来决定最佳选择有点“杀鸡用牛刀”了,只要采用另一些更简单有效的算法就行了。贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解。贪心算法对大多数优化问题来说能产生最优解,但也不一定总是这样。


空间换时间 HASH

暴力求解

你可能感兴趣的:(算法常用概念解释)