-
思维导图
-
基本概念
-
算法:
对特定问题求解步骤的一种描述,是指令的有限序列,其中的每条指令表示一个或多个操作。 -
语句频度
该语句在算法中被重复执行的次数,算法中所有语句的频度之和记为 T ( n ) T\left( n \right) T(n) ,n与函数规模直接相关 -
时间复杂度
时间复杂度主要分析 T ( n ) T\left( n \right) T(n)的数量级,而算法中基本运算(最深层循环内的语句)的频度 f ( n ) f\left( n \right) f(n)与 T ( n ) T\left( n \right) T(n)是一个数量级的。所以算法的时间复杂度可以记为:
T ( n ) = O ( f ( n ) ) T\left( n \right) =O\left( f\left( n \right) \right) T(n)=O(f(n))
-
-
时间复杂度的计算
-
循环主体中的变量参与循环条件的判断
void fun(int n){ int i = 1; while(i<=n) # 循环条件 i = i*2 # 循环主体 }
设t为循环主体执行次数 t=1 i=1*2 2^1 t=2 i=1*2*2 2^2 ... t=t i=1*2*2*...(共t个2) 2^t
只需算出令循环终止的t即为该算法的时间复杂度
2 t < = n 2^t<=n 2t<=n
t = log 2 n t=\log _2n t=log2n
所以时间复杂度为 O ( log 2 n ) O\left( \log _2n \right) O(log2n)
这种题目:要理清t和i的关系,并在终止循环条件中,用t换i解出t关于n的表达式。 -
循环主体中的变量与循环条件无关
for(i=0;i<=n,i++)#循环条件1 for(j=0;j<=i;j++) #循环条件2 for(k=1;k<=j;k++) #循环条件3 x++ #循环主体
忽略循环主体本身,只关注其执行次数,多层循环,由内向外依次累加 ,经过分析可以写出: f ( n ) = ∑ i = 1 n ∑ j = 1 i ∑ k = 1 j 1 ≈ n ∗ ( n + 1 ) ∗ ( 2 n + 1 ) 6 f\left( n \right) \ =\ \sum_{i=1}^n{\sum_{j=1}^i{\sum_{k=1}^j{1}}}\ \approx \ \frac{n*\left( n+1 \right) *\left( 2n+1 \right)}{6} f(n) = i=1∑nj=1∑ik=1∑j1 ≈ 6n∗(n+1)∗(2n+1)
即: T ( n ) = O ( n 3 ) T\left( n \right) =O\left( n^3 \right) T(n)=O(n3) -
递归型
int fact(int n){ if (n<=1) return 1 # 递归出口 return n*fact(n-1) # 循环主体 }
这里应该考虑函数本身调用自己多少次才到递归出口,可以通过数学归纳法,写几个看看
fact(n) = n*fact(n-1) fact(n-1) = (n-1)*fact(n-2) fact(n-2) = (n-2)*fact(n-3) ... fact(2)=(n-(n-1))*fact(1) fact(1) = 1
每调用一次,fact(n)中的n就会减少1,n次后到达出口
-
数据结构学习笔记(二)
最新推荐文章于 2022-04-12 23:50:19 发布