数据结构|根据算法写出时间复杂度


结合各种资料,整理出来两类形式

循环主题中的变量参与循环条件的判断

int i=1;
while(i<=n)
	i=i*2;

i = i ∗ 2 i=i*2 i=i2是语句执行主体,设执行的次数是t,则有 2 t ≤ n 2^t \leq n 2tn,可以得到结果 t ≤ log ⁡ 2 n t \leq \log_2^n tlog2n
所以有 T ( n ) = O ( log ⁡ 2 n ) T(n)=O(\log_2^n) T(n)=O(log2n)

int y=5;
while((y+1)*(y+1)<n)
	y=y+1;

y = y + 1 y=y+1 y=y+1是语句执行主体,设执行的次数是t,则有 t = y − 5 t=y-5 t=y5,带入可以得到 ( t + 5 + 1 ) ∗ ( t + 5 + 1 ) < n (t+5+1)*(t+5+1)<n (t+5+1)(t+5+1)<n,可以得到结果 t < n − 6 t < \sqrt n-6 t<n 6
所以有 T ( n ) = O ( n ) T(n)=O(\sqrt n) T(n)=O(n )

循环主题中的变量与循环条件无关

  1. 递归程序
    一般转换成公式进行递推。
    一个算法所需事件有下属递归方程式表示,试求出该算法的时间复杂度的级别,n是问题的规模。
    T ( n ) = { 1 , n=1 2 T ( n / 2 ) + n , n>1 T(n)= \begin{cases} 1, &\text{n=1} \\ 2T(n/2)+n, &\text{n>1} \\ \end{cases} T(n)={1,2T(n/2)+n,n=1n>1
    解: T ( 2 k ) = 2 k T ( 0 ) + k ∗ 2 k T(2^k)=2^kT(0)+k*2^k T(2k)=2kT(0)+k2k,化简得到 T ( n ) = n + n ∗ log ⁡ 2 n T(n)=n+n*\log_2^n T(n)=n+nlog2n,
    得到结果 T ( n ) = O ( n ∗ log ⁡ 2 n ) T(n)=O(n*\log_2^n) T(n)=O(nlog2n)

  2. 非递归程序
    比较简单,可以直接累计次数。

int func(int n){
	int i=0, sum=0;
	while(sum<n) sum += ++i;
	return i;
}

主体语句 s u m + = + + i ; sum += ++i; sum+=++i;,设执行的次数是t,得到的 s u m = 0 + 1 + 2 + . . . + t = 1 2 ∗ i ∗ ( i + 1 ) < n sum=0+1+2+...+t=\frac{1}{2}*i*(i+1)<n sum=0+1+2+...+t=21i(i+1)<n.
所以有 T ( n ) = O ( n ) T(n)=O(\sqrt n) T(n)=O(n )

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值