详解时间复杂度计算公式(附例题细致讲解过程)

简介: 详解时间复杂度计算公式(附例题细致讲解过程)

一、什么是时间复杂度

时间复杂度(Time complexity)是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数. 时间复杂度常用大O表述,不包括这个函数的低阶项和首项系数。

时间复杂度大小比较:

时间复杂度分类:

  • 算法完成工作最少需要多少基本操作叫做最优时间复杂度,是一种最乐观最理想的状态。
  • 算法完成工作最多需要多少基本操作叫做最坏时间复杂度,是算法的一个保障。
  • 算法完成工作平均需要多少基本操作叫做平均时间复杂度,它可以均匀全面的评价一个算法的好坏。

时间复杂度基本计算规则:

  1. 基本操作即只有常数项,认为其时间复杂度为O(1)
  2. 顺序结构,时间复杂度按加法进行计算
  3. 循环结构,时间复杂度按乘法进行计算
  4. 分支结构,时间复杂度取最大值
  5. 判断一个算法效率时,往往只需要关注操作数量的最高次项,其他次要项和常数项可以忽略
  6. 在没有特殊说明时,我们所分析的时间复杂度都是指最坏时间复杂度

二、单层循环时间复杂度计算公式

解题步骤

  1. 列出循环趟数t及每轮循环i的变化值
  2. 找到t与i的关系
  3. 确定循环停止条件
  4. 联立两式解方程
  5. 写结果

例题分析

例一:

1. i = n*n;
2. whlie(i != 1)
3.     i = i/2;

第一步:列出循环趟数t及每轮循环i的变化值:

t 0 1 2 3
i

第二步:找到t与i的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:

所以得到时间复杂度为:

例二:

1. x = 0;
2. while (n>=(x+1)*(x+1))
3.     x = x+1;

第一步:列出循环趟数t及每轮循环x的变化值:

t 0 1 2 3 4
x 0 1 2 3 4

第二步:找到t与x的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:

所以得到时间复杂度为:

例三:

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

第一步:列出循环趟数t及每轮循环i的变化值:

t 0 1 2 3 4
i 0 1 2 3 4

第二步:找到t与x的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:

所以得到时间复杂度为:

例四:

1. int i = 0;
2. while (i*i*i<=n)
3.     i ++;

第一步:列出循环趟数t及每轮循环i的变化值:

t 0 1 2 3 4
i 0 1 2 3 4

第二步:找到t与x的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:

所以得到时间复杂度为:

例五:

1. y = 0;
2. while (y+1)*(y+1) <= n
3.     y = y+1;

第一步:列出循环趟数t及每轮循环y的变化值:

t 0 1 2 3 4
y 0 1 2 3 4

第二步:找到t与x的关系:

第三步:确定循环停止条件:

第四步:联立第二步第三步两式解方程:

所以得到时间复杂度为:

三、两层循环时间复杂度计算公式

解题步骤

  1. 列出循环中i的变化值
  2. 列出内层语句的执行次数
  3. 求和,写结果

例题分析

例一:

1. int m=0,i,j;
2. for (i=1;i<=n;i++)
3. for(j=1;j<=2*i;j++)
4.         m++;

第一步列出循环中i的变化值:

第二步列出内层语句的执行次数:

i 1 2 3 4 5 ...... n
内层语句执行次数 2 4 6 8 10 ...... 2*n次

第三步 求和,写结果

例二:

1. for (i=0;i<n;i++)
2. for(j=0;j<m;j++)
3.         a[i][j] = 0;

第一步列出循环中i的变化值:

第二步列出内层语句的执行次数:

i 0 1 2 3 4 ...... n-1
内层语句执行次数 m m m m m ...... m次

第三步 求和,写结果

例三:

1. count = 0;
2. for (k=1;k<=n;k*=2)
3. for(j=1;j<=n;j++)
4.         count ++;

这里k*=2,不再是++,所以要先用单层循环求出变换趟数:

t 1 2 3 4
k 1 2 3 4

内层每个都是n,求和则可以得到:

例四:

1. for (i=n-1;i>=1;i--)
2. for(j=1;j<=i;j++)
3. if A[j] > A [j+1]
4.             A[j]与A[j+1]交换;

第一步列出循环中i的变化值:

第二步列出内层语句的执行次数:

i n-1 n-2 ...... 2
内层语句执行次数 n-2 n-3 ...... 1次

第三步 求和,写结果

四、多层循环时间复杂度计算公式

方法一:抽象为计算三维物体体积

方法二:列式求和

例一:

1. for(i=0;i<=n;i++)
2. for(j=0;j<=i;j++)
3. for(k=0;k<j;k++)

方法一:抽象为计算三维物体体积:

i依赖于n,j依赖于i,k依赖于j,三者都可以看成是n,再由体积公式可以求出

方法二:列式求和:


相关文章
|
6月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1完整版-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
127 0
|
存储 人工智能 算法
【算法分析与设计】动态规划(下)(一)
【算法分析与设计】动态规划(下)
欧拉筛(最优的方法,对于找质数,细节讲解)
欧拉筛(最优的方法,对于找质数,细节讲解)
119 0
|
6月前
【错题集-编程题】不相邻取数(动态规划 - 线性 dp)
【错题集-编程题】不相邻取数(动态规划 - 线性 dp)
动态规划|【斐波那契数列模型 】|746.使用最小花费爬楼梯
动态规划|【斐波那契数列模型 】|746.使用最小花费爬楼梯
|
算法
贪心算法的思路和典型例题
贪心算法的思路和典型例题
算法训练Day38|● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
算法训练Day38|● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯
|
机器学习/深度学习 算法 C++
由数据范围反推算法复杂度以及算法内容
由数据范围反推算法复杂度以及算法内容
|
算法
算法设计与分析/数据结构与算法实验4:添加括号数目问题
算法设计与分析/数据结构与算法实验4:添加括号数目问题
184 0
算法设计与分析/数据结构与算法实验4:添加括号数目问题
|
算法 搜索推荐
算法复杂度分析中的渐近分析(基于输入大小)
有许多重要的事情需要注意,例如用户友好性、模块化、安全性、可维护性等。为什么要担心性能?答案很简单,只有当我们有性能时,我们才能拥有上述所有东西。因此,性能就像货币,我们可以通过它购买上述所有东西。学习性能的另一个原因是——速度很有趣!
111 0