算法分析上课笔记(1)

#递归与分治策略

递归的概念:直接或间接地调用自身的算法称为递归算法
例:二叉树的先序遍历
分治法的的设计思想:将一个难以直接解决的大问题, 分割成一些规模较小的相同问题,以便各个击破,
分而治之。(对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直 到问题规模足够小,很容易求出其解为止。)(自底向上)
递归与分治法经常同时应用到算法设计之中。

##1.阶乘函数

在这里插入图片描述

边界条件与递归方程是递归函数的两个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。

##2.Fibonacci数列
在这里插入图片描述

这是一个递归方程式,当n>1时,这个数列的第n项的值是它前两项之和。它用两个较小的自变量的函数值来定义一个较大自变量的函数值,所以需要两个初始值F(0)和F(1)
##3.Ackerman函数
双递归函数:当一个函数及它的一个变量是由函数自身定义时,称这个函数 是双递归函数。
Ackerman函数A(n,m)有两个独立的整型变量m>=0和n>=0,其定义如下:
在这里插入图片描述
当M=2时,A(n,2)=n^2
##4.排列问题
设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前缀得到的排列。R的全排列可归纳定义如下:
当n=1时,perm®=®,其中r是集合R中唯一的元素; 当n>1时,perm®由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。
##5.整数划分问题
将正整数n表示成一系列正整数之和:n=n1+n2+…+nk, 其中n1≥n2≥…≥nk≥1,k≥1。
正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。
在本例中,如果设p(n)为正整数n的划分数,则难以找到递归关 系,因此考虑增加一个自变量:将最大加数n1不大于m的划分 个数记作q(n,m)。
在这里插入图片描述

##6.Hanoi塔问题
设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这 些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号
为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍
按同样顺序叠置。在移动圆盘时应遵守以下移动规则:
规则1:每次只能移动1个圆盘;
规则2:任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 规则3:在满足移动规则1和2的前提下,可将圆盘移至a,b,c中 任一塔座上。
Hanoi塔问题的递归算法
void hanoi(int n, int a, int b, int c)
{
if (n > 0)
{
hanoi(n-1, a, c, b);
move(a,b);
hanoi(n-1, c, b, a);
}
}
递归小结
优点:结构清晰,可读性强,而且容易用 数学归纳法来证明算法的正确性,因此它 为设计算法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是 耗费的计算时间还是占用的存储空间都比 非递归算法要多。

#分治法
分治法的适用条件:该问题的规模缩小到一定的程度就可以容易地解决;(可以找到递归出口)
该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质(找到递归体)
利用该问题分解出的子问题的解可以合并为该问题的解;(治理)
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
分治法的基本步骤:
在这里插入图片描述

人们从大量实践中发现,在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。
分治法的复杂性分析:
一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。再设将原问题分解为k个子问题以及用merge将k个子问题的解合并为原问题的解需用f(n)个单位时间。

递归方程的解

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

##1.二分搜索技术
给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x。
算法复杂度分析:
每执行一次算法的while循环, 待搜索数组的大小减少一半。因此,在最坏情况下,while循环被执行了O(logn) 次。循环体内运算需要O(1) 时间,因此整个算法在最坏情况下的计算时间复杂性为O(logn) 。

在这里插入图片描述

##2.大整数乘法
设计一个有效的算法,可以进行两个n位大整数的乘法运算
在这里插入图片描述

##3.Strassen矩阵乘法
A和B的乘积矩阵C中的元素C[i,j]定义为:
为了降低时间复杂度,必须减少乘法的次数。

在这里插入图片描述

##4.棋盘覆盖
在这里插入图片描述
##5.归并排序
基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。
在这里插入图片描述
##6.快速排序
快速排序算法的性能取决于划分的对称性。通过修改算法partition,可以设计出采用随机选择策略的快速排序算法。在快速排序算法的每一步中,当数组还没有被划分时,可以在a[p:r]中随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分是较对称的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值