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

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

一、什么是时间复杂度

时间复杂度(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,再由体积公式可以求出

方法二:列式求和:


相关文章
|
7月前
|
算法 JavaScript Java
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
【状态压缩】【动态规划】【C++算法】1125.最小的必要团队
|
7月前
|
算法 测试技术 C++
【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
【动态规划】【前缀和】【数学】2338. 统计理想数组的数目
|
7月前
|
机器学习/深度学习 人工智能 算法
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题
137 0
|
6月前
|
存储 SQL 算法
优化解码方法:记忆化搜索和空间优化动态规划的实用指南 【LeetCode 题目 91】
优化解码方法:记忆化搜索和空间优化动态规划的实用指南 【LeetCode 题目 91】
|
7月前
【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)
【编程题-错题集】连续子数组最大和(动态规划 - 线性 dp)
|
7月前
|
人工智能 算法 BI
【树】【因子数】【数论】【深度优先搜索】2440. 创建价值相同的连通块
【树】【因子数】【数论】【深度优先搜索】2440. 创建价值相同的连通块
|
7月前
|
算法 测试技术 C#
【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大
【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大
|
7月前
|
存储 算法
算法题解-组合总和3
算法题解-组合总和3
|
算法
贪心算法的思路和典型例题
贪心算法的思路和典型例题
|
存储 算法 C语言
动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析
动态规划算法解决背包问题,算法分析与C语言代码实现,时间效率解析
211 0