(一)算法分析

对于一个问题,给定某种算法并且确定其是正确的,那么重要的一步就是确定该算法将需要多少诸如时间或空间等资源量的问题。
1. 如何估计一个程序所需要的时间
2. 如何降低一个程序的运行时间
3. 递归的每一层迭代都应该比上一层消耗少
4. 将一个数自乘得到其幂以及计算两个数的最大公因数的有效算法

一. 数学基础
假定两个函数T(N)=1000N,f(N)=N*N,在N较小时,1000N比N*N大,但是N*N以更快的速度增长,最终N*N将更大,在这种情况下,N=1000是转折点。也就是说,会存在某个点,从它以后c*f(N)总是至少与T(N)一样大,从而忽略常数因子。

法则1:
如果T1(N)=O(f(N))且T2(N)=O(g(N)),那么
a. T1(N) + T2(N) = max(O(f(N)),O(g(N)),
b. T1(N) * T2(N) = O(f(N)*g(N))
法则2:
如果T(N)是一个k次多项式,T(N)=O(N^k)
法则3:
对任意常数k,(logN)^k = O(N),它告诉我们对数增长非常缓慢。
注意:
1.在需要大O表示的分析中,各种简化都是可能发生的。
不要写成T(N)=O(2N^2)或T(N)=O(N^2+N),直接写成T(N)=O(N^2)。
2.能够通过计算极限limf(N)/g(N) (n趋无穷大)来确定两个函数f(N)与g(N)的相对增长率,可以用洛必达法则。

二. 时间
1.假设无限内存。
要分析的最重要的资源一般来说是运行时间,假定不考虑编译器和计算机的操作时间。主要因素是所使用的算法以及对该算法的输入。
一般来说,考虑的是最坏情况下的运行时间。
一般情况下:O(N) < O(NlogN) < O(N^2) < O(2^N)

计算时间复杂度:
1. For循环(O(N))
2. 嵌套For(O(N^N))
3. 顺序语句(O(N)+O(N^N))
4. If/else语句(条件+分之中最大的)

若T(1)=1,T(N)=2(N/2)+O(N)。
计算时,可以用N代替O(N),因为T(N)最终还是要用O表示。
T(2)=4=2*2,T(4)=12=4*3,T(8)=32=8*4,T(16)=80=16*5
即若N=2^k, T(N)=N*(k+1) = NlogN + N = O(NlogN)。
上面的分析假设N是偶数且是2 的幂,结果才是合理的。当N不是的时候,需要更加复杂的一些分析,但是大O的结果不变。

2.运行时间中的对数
如果一个算法用常数时间(O(1))将问题的大小消减为其一部分(通常是1/2),那么该算法是O(logN)。如果用常数时间只是把时间减少一个常数(如将问题减少1),那么该算法是O(N)的。
二分查找
循环从high-low=N-1开始并在high-low>=-1结束,每次循环后high-low的值是折半。于是循环次数最多为[low(N-1)]+2。(若high-low=128,则64,32,16,8,4,2,1,0,-1)因此时间是O(logN)。
欧几里德算法
计算最大公因数。
定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(greatest common divisor)缩写为gcd。
gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)
幂运算
计算X^N
如果N是偶数,X^N=(X^N/2)*(X^N/2)
如果N是奇数,X^N=(X*(N-1)/2)*(X^(N-1)/2)*X

3.检验分析
观察实际的运行时间来进行分析

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值