递归算法分析
Case1:求n!
构造算法中的两个步骤:
- n!=n*(n-1)!
- 0!=1,1!=1
递归算法如下(以n=3为例) 调用过程为:
f(3)--f(2)--f(1)--f(2)---f(3)
---- 递归 -->-------回溯------->
递归调用其实是一个降低规模的过程,和一般算法一样,算法的起始模块通常也是终止模块。
当规模降为1 时,即递归到f(1)时,满足停止条件停止递归,开始回溯并计算。
- 从fact(1)=1返回到f(2);
- 计算2*f(1)=2返回到f(3);
- 计算3*f(2)=6;
- 结束递归。
拓展:
为了更好理解,可以把不同次递归调用当作调用了不同的模块(但实际上每次递归调用都是同一个算法模块,在每一次递归调用都是用一个特殊的结构“栈”,记录当前算法的执行状态,特别设置地址栈,用来记录当前算法的执行位置,以备回溯时正常返回,递归模块中的形式参数和局部变量虽然是定义为简单的变量,每次递归调用得到的值都是不同的,它们都是由“栈”来存储的)
递归算法效率分析法--迭代法
基本步骤:
先将递归算法简化成对应的递归方程,然后通过反复迭代,将递归方程的右端变换成一个级数,最后求级数的和。再估计和的渐近阶,或者,不求级数的和耐而直接估计级数的渐近阶,从而达到对递归方程解的渐近阶的估计。
拓展:
用迭代方法的估计递归算法的解,就是充分利用递归算法中递归关系,通过一定的代数,运算和数学分析的级数知识,得到问题的复杂度。
例如Case1:n!
算法的递归方程:
T(n)=T(n-1)+O(1)
其中O(1)为一次乘法操作,迭代求解过程如下:
T(n) =T(n-2)+O(1)+O(1)
=T(n-3)+O(1)+O(1)+O(1)
......
=O(1)+......+O(1)+O(1)
=n*O(1)
=O(n)
现在常用算法简介:
压缩算法:
- 无损压缩算法:文本数据压缩都是无损压缩,即还原后的文件和源文件完全相同。常见有:哈夫曼编码,算术编码,字节压缩算法和字典压缩算法。(各个具体就不详细说明,感兴趣的可以自己百度一下)
- 有损压缩算法:以音频数据的压缩技术为例,为了更高的编码效率,都允许一定程度的精度损失。
加密算法(内容较多,不具体详细讲解):
- 对称加密
- 非对称加密