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

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

一、什么是时间复杂度

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

方法二:列式求和:


相关文章
|
存储 算法 搜索推荐
【算法基础】时间复杂度和空间复杂度
【算法基础】时间复杂度和空间复杂度
943 0
|
存储 算法
算法的时间复杂度和空间复杂度
本文详细讨论了算法的时间复杂度和空间复杂度,包括它们的概念、计算方法和常见复杂度的对比,并通过多个实例解释了如何计算算法的时间和空间复杂度。
1742 0
算法的时间复杂度和空间复杂度
|
存储 机器学习/深度学习 人工智能
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
数据结构学习笔记——图的存储结构(邻接矩阵和邻接表)
|
机器学习/深度学习 算法
【软件设计师】通俗易懂的去了解算法的时间复杂度
【软件设计师】通俗易懂的去了解算法的时间复杂度
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
853 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
存储
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
数据结构:图文详解单链表的各种操作(头插法,尾插法,任意位置插入,删除节点,查询节点,求链表的长度,清空链表)
3031 0
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
1580 4
|
算法 搜索推荐
数据结构与算法学习十八:堆排序
这篇文章介绍了堆排序是一种通过构建堆数据结构来实现的高效排序算法,具有平均和最坏时间复杂度为O(nlogn)的特点。
652 0
数据结构与算法学习十八:堆排序
|
机器学习/深度学习 存储 算法
算法时间复杂度分析
这篇文章讲解了如何分析算法的时间复杂度,包括关注循环执行次数最多的代码段、总复杂度的确定、嵌套代码复杂度的计算方法,并提供了大O阶的推导步骤和常见时间复杂度的列表,同时还介绍了空间复杂度的概念及其重要性。
|
机器学习/深度学习 自然语言处理
序列到序列(Seq2Seq)模型
序列到序列(Seq2Seq)模型
854 8