数据结构-时间复杂度计算示例
1 数据结构-第一章-思维导图
数据结构-第一章-思维导图缩略图展示如下图1所示:
2 时间复杂度-简介
在计算机科学中,时间复杂性,又称时间复杂度,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
------粘百度百科
3 时间复杂度-示例
3.1 时间复杂度-常用技巧
时间复杂度的计算满足两个规则,分别是加法规则和乘法规则:
1.加法规则(多项相加,只保留最高阶的项,且系数变为1):T(n) = T1(n) + T2(n) = O(f(n)) + O(g(n)) = O(max(f(n) , g(n)))
2.乘法规则(多项相乘,都保留):T(n) = T1(n) × T2(n) = O(f(n)) × O(g(n)) = O(f(n) × g(n))
时间复杂度的计算中,常见时间复杂度之间的关系。
所消耗的时间从小到大排序为:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn),口诀是“常对幂指阶”。
1、顺序执行代码中语句只会影响常数项,可以忽略;
2、循环语句中,只需挑循环中的一个基本操作分析它的执行次数和n的关系即可;
3、如果有多层嵌套循环,只需关注最深层循环循环了几次。
3.2 时间复杂度-示例
以下题目均来自王道考研系列-《数据结构考研复习指导》,均为计算时间复杂度。
3.2.1 对数阶-时间复杂度计算
1、以下算法的时间复杂度为:
void fun(int n){
int i = 1;
while(i <= n)
i = i * 2;
}
1、【解析】基本运算为i = i * 2,该语句每次执行就是i乘2,设执行次数为t,则2t≤n,即t≤log2n,因此时间复杂度T(n)=O(log2n)。
2、设n是描述问题规模的非负整数,下面的程序片段的时间复杂度是:
x = 2;
while(x < n/2)
x = 2 * x;
2、【解析】基本运算为x = 2 * x,该语句每次执行就是x乘2,设执行次数为t,则2t+1≤n/2,即t≤log2n-2,根据加法规则,得到时间复杂度为T(n) = T1(n) + T2(n)= O(f(log2n)) + O(g(-2)) = O(max(f(log2n) , g(-2)))=O(log2n),即T(n) = O(log2n)。
3、下列程序段的时间复杂度是:
count = 0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count++;
3、【解析】内层循环条件j≤n与外层循环的变量无关,各自独立,每执行一次j自增1,每次内层循环都都执行n次。外层循环条件k≤n,增量定义为k*=2,设循环次数为t,则t满足2t≤n,即t≤log2n。即内层循环的时间复杂度为O(n),外层循环的时间复杂度为O(log2n)。对于嵌套循环,根据乘法规则可知,该段程序的时间复杂度为:T(n) = T1(n) × T2(n) = O(n) × O(log2n) = O(nlog2n)。
3.2.1 幂数阶-时间复杂度计算
1、有以下算法,其时间复杂度为:
void fun(int n){
int i = 0;
while(i*i*i<=n)
i++;
}
1、【解析】基本运算为i++,该语句每次执行就是i加1,设执行次数为t,有t×t×t≤n,即t3≤n,即t≤n1/3,因此时间复杂度T(n)=O(n1/3)。
2、下列函数的时间复杂度是:
int func(int n){
int i=0, sum=0;
while(sum<n) sum += ++i;
return i;
}
2、【解析】基本运算为sum += ++i,它等价于++i;sum=sum+i,每执行一次i自增1,i=1时,sum=0+1;i=2时,sum=0+1+2;i=3时,sum=0+1+2+3,以此类推得出sum=0+1+2+3+…+i=(i+1)*i/2,设循环次数为t,则t满足(t+1)*t/2<n,因此时间复杂度为T(n)=O(n1/2)。
3、设n是描述问题规模的非负整数,下列程序段的时间复杂度是:
x = 0;
while(n>=(x+1)*(x+1))
x = x + 1;
3、【解析】基本运算为x = x + 1,该语句每次执行就是x加1,假设第k次循环终止,则第k次执行时,(x+1)2>n,x的初始值为0,第k次判断时x=k-1,即k2>n,k>n1/2,因此该程序段的时间复杂度为T(n)=O(n1/2)。