时间复杂度分析

影响时间复杂度的因素主要有1,机器硬件速度;2,书写程序的语言;3,数据规模 n;4,数据分布 D(原始数据的排列方式)。暂且不考虑硬件速度和程序语言,假设算法运行时间为T = f (D, n)

确定基本操作

例:s = 0; for(i = 0; i < n; i++) s = s + i;

假设赋值运算所需时间为c1秒,一次加法为c2秒,那么算法总运行时间T = c1 + c2*n + c2*n ,再假设c1和c2近似相等,则化简为T/c1 = 1 + 2n ,T为绝对时间,T/c1为相对时间,含义是基本操作执行的次数。下面还是将T作为基本操作执行次数,即T = 1 + 2n。所以为了比较不同算法效果,通常做法是:从算法中选取是对所研究问题来说是基本运算的操作,以该操作重复执行的次数作为算法的时间度量。

处理数据分布

比方一个数组,考虑三种分布:升序,降序,随机排序,采用插入排序方法,升序时间最短,降序最长,第三种可以通过概率分布求出平均时间。我们用三种极端情况代替概率分布,分别是最好情况,最坏情况,平均情况,即Tworst, Tbest, Tavg。通常只要分析最坏情况就行,一般下T = f (n) 表示最坏情况下时间复杂度关系式

函数关系的简化与渐进分析

T(n) 往往是复杂数学公式,一种新的表示方法叫函数的界或函数的阶,将函数T(n)分成几种类别,任何算法的复杂度都属于某一个类别。如T1 = n^2, T2 = 1/2n^2 + 1/2n , n趋于无穷时T1和T2同阶,所以可以表示成T1 = O(n^2), T2 = O(n^2)。这种表示称为大O表示法,本质是只取函数变化最快的项代表时间复杂度的阶

非递归算法的时间复杂度类型

T = O(n),T = O(n),T = O(n^2)没什么好说的

T = O(nlog2 n)的二重循环,例如:for(int i = 1; i <= n; i *= 2)  for(int j = 1; j <= n; j++) count = count + 1; 最里面循环执行n次,外面那层循环假设执行次数为f(n),2^f(n) <= n ,所以最多执行次数为log2 n

递归算法时间复杂度分析

以汉诺塔为例:ABC三个柱子,A柱有n个盘子,盘子由大到小从下到上放置,要求将A柱上盘子移到C柱上,但是一次只能移动一只盘子,小盘子只能在大盘子上面。

算法设计: public void hanoi(int n, char A, char B, char C){

if(n == 1) move(A, C);

else{ hanoi(n-1, A, B, C);  //将上面n-1个盘子移到B柱上

move(A, C);  //将最下面的盘子移到C柱上面去

hanoi(n-1, B, A, C); //将B柱上n-1个盘子移到C柱上

本题的基本操作为move(A, C),递归关系式为T(n) = 2T(n-1) + 1, T(1) = 1,求解后T(n) = 2^n - 1即T(n) = O(2^n)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值