一、时间复杂的的概念
1、定义
时间复杂度(time complexxity)是一个定性描述该算法运行时间的函数,它代表算法输入值的字符串的长度。时间复杂度常用O表述,不包括这个函数的低阶项和首项系数。
时间复杂度的大小比较:
时间复杂度的分类:
- 算法完成工作最少需要多少基本操作叫做最优时间复杂度,是一种最乐观理想的状态;
- 算法完成工作需要多少基本操作叫做最坏时间复杂度,是算法的一个保障;
- 算法完成工作平均需要多少基本操作叫做平均时间复杂度,它可以均匀全面地评价一个算法的好坏。
2、基本计算规则
- 基本操作即只有常数项,认为其时间复杂度为O(1);
- 顺序结构,时间复杂度按加法计算;
- 循环结构,时间复杂度按乘法计算;
- 分支结构,时间复杂度取最大值;
- 判断一个算法效率时,往往只需要关注操作的最高次项,其他次要项和常数项可以忽略;
- 在没有特殊说明时,我们所分析的时间复杂度都是最坏时间复杂度。
二、单层循环时间复杂度计算公式
计算步骤:
- 列出循环趟数t及每轮循环i的变化值
- 找到t与i的关系
- 确定循环停止条件
- 联立两式解方程
- 写结果
例题分析一:
i = n*n;
whlie(i != 1)
i = i/2;
第一步:列出循环趟数t和每轮循环i的变化值
t | 0 | 1 | 2 | 3 |
---|---|---|---|---|
i | n^2 | (n^2)/2 | (n^2)/4 | (n^2)/8 |
第二步:找到t和i的关系
i = (n2)/2t
第三步:确定循环停止条件
i =1
第四步:联立第二步和第三步两式解方程:
所以得到的时间复杂度为:
例题分析二:
x = 0;
whlie(n>=(x+1)*(x+1))
x = x+1;
第一步:列出循环趟数t和每轮循环x的值:
t | 0 | 1 | 2 | 3 |
---|---|---|---|---|
x | 0 | 1 | 2 | 3 |
第二步:找到t与x的关系:
t = x
第三步:确定循环停止的条件
第四步:联立第二步和第三步解方程
所以时间复杂度为:
三、双层循环时间复杂度计算公式
解题步骤:
- 列出循环中i的变化值
- 写出内层语句的执行次数
- 求和,写结果
例题分析一:
int m = 0, i , j;
for(i = 1; i<=n;i++)
for(j = 1;j<=2*i;j++)
m++;
第一步:列出循环中i的变化值
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | … | n |
---|
第二步:写出内层语句的执行次数
内层语句执行次数 | 2 | 4 | 6 | 8 | 10 | … | 2*n |
---|
第四步:求和,写结果
2+4+6+8+…+2*n = n(n+1)
所以时间复杂度为:
例题分析二:
for(i = 0;i<n;i++)
for(j=0;j<m;j++)
a[i][j] = 0;
第一步:列出循环中i的变化值
i | 0 | 1 | 2 | 3 | 4 | … | n-1 |
---|
第二步:写出内层语句执行次数
内层语句执行次数 | m | m | m | m | … | m |
---|
第三步:求和,写结果
m * (n-1-0+1) = m*n
例题分析三:
count = 0;
for(k=1;k<=n;k*=2)
for(j=1;j<=n;j++)
count ++;
注意此处外层循环中不是k++而是k *=2,所以先计算外层循环的单层时间复杂度:
循环趟数t | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
k | 1 | 2 | 4 | 8 | 16 | 32 |
循环趟数t和k关系:
循环停止条件为:k =n
联立两式,得:
外层的时间复杂度就为:
计算内层时间复杂度为O(n)
总体时间复杂度为:
四、多层循环时间复杂度计算公式
例题分析一:
for(i=0;i<=n;i++)
for(j=0;j<=i;j++)
for(k=0;k<j;k++)
1、法一:抽象为计算三维物体的体积
时间复杂度为:
2、法二:列式求和