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

本文详细解析了时间复杂度概念,提供了单层、两层和多层循环的时间复杂度计算公式实例,并通过计算三维物体体积和列式求和的方法帮助理解。掌握这些技巧,提升算法题目的解题能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天开始刷力扣上面的算法题,有些题目上面限制时间复杂度空间复杂度,题目虽然写出来了,但是很没底。印象里数据结构老师讲过一点,沉睡的记忆苏醒了。只记得一个时间复杂度是O(n),空间复杂度是S(n)。for循环常常是O(n),具体是怎么算的不清楚。所以在看了相关的视频教学后,总结一下时间复杂度的计算公式,希望能给大家的学习带来帮助!

目录

一、什么是时间复杂度 

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

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

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

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

方法二:列式求和


一、什么是时间复杂度 

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

时间复杂度大小比较:

时间复杂度分类:

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

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

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

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

 解题步骤

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

 例题分析

 例一:

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

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

t0123
in^{2}\frac{n^2}{2}\frac{n^2}{4}\frac{n^2}{8}

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

 i=\frac{n^{2}}{2^{t}}

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

i = 1

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

\frac{n^{2}}{2^{t}} = 1 \quad\quad n^2 = 2^t \quad\quad t = \log_2n^2

t = \log_2n^2 = 2\log_2n

所以得到时间复杂度为:

T = O(\log_2n)

例二:

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

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

t01234
x01234

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

 t = x

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

n = (x+1)^2

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

(t +1)^2 = n

t = \sqrt[]{n}-1

所以得到时间复杂度为:

T=O(\sqrt[]{n})

 例三:

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

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

t01234
i01234

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

 i = 2^t

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

i = n

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

2^t = n

t = \log_2n

所以得到时间复杂度为:

T = O(\log_2n)

 例四:

int i = 0;
while (i*i*i<=n)
    i ++;

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

t01234
i01234

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

 i=t

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

i^3 = t

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

t^3 = n

t = \sqrt[3]{n}

所以得到时间复杂度为:

T=O( \sqrt[3]{n})

 例五:

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

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

t01234
y01234

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

 t = y

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

(y+1)^2= n

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

(t +1)^2 = n

t = \sqrt[]{n}-1

所以得到时间复杂度为:

T=O(\sqrt[]{n})

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

 解题步骤

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

 例题分析

例一:

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

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

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

i12345......n
内层语句执行次数246810......2*n次

第三步 求和,写结果

2+4+...+2n = \frac{2+2n}{2}n = n(n+1)

T= O(n^2)

 例二:

for (i=0;i<n;i++)
    for(j=0;j<m;j++)
        a[i][j] = 0;

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

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

i01234......n-1
内层语句执行次数mmmmm......m次

第三步 求和,写结果

m*(n-1-0+1) = m*n

T = O(mn)

 例三:

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

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

t1234
k1234

k = 2^{t-1}

t = \log_2k +1

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

T= O(n\log_2n)

 例四:

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

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

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

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

第三步 求和,写结果

\frac{n-2+1}{2}*(n-2) = \frac{n+1}{2}*(n-2)

T=O(n^2)

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

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

方法二:列式求和

例一:

for(i=0;i<=n;i++)
    for(j=0;j<=i;j++)
        for(k=0;k<j;k++)

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

 i依赖于n,j依赖于i,k依赖于j,三者都可以看成是n,再由体积公式V = \frac{1}{3}Sh可以求出

T= O(n^3)

方法二:列式求和:

\sum_{i=0}^{n}\sum_{j=0}^{i}\sum_{k=0}^{j-1} = \sum_{i=0}^{n}\sum_{j=0}^{i}\(j-1-0+1)= \sum_{i=0}^{n}\sum_{j=0}^{i}\j

\sum_{i=0}^{n}\sum_{j=0}^{i}\j= \sum_{i=0}^{n}\frac{i(i+1)}{2}=\sum_{i=0}^{n}(i^2+i)=\frac{1}{2}\sum_{i=0}^{n}i^2=\frac{1}{2}\sum_{i=0}^{n}i=O(n^3)

T = O(n^3)

<think>嗯,用户让我介绍一下时间复杂度的计。我需要先理清楚思路,确保自己理解正确,然后一步步解释清楚。首先,我应该从基本概念入手,什么是时间复杂度,为什么它重要。然后介绍大O符号,这是最常用的表示方法。接着,可能需要分步骤讲解如何计,比如找出基本操作、确定输入规模、计执行次数,最后简化为大O表示。还要注意常见的例子,比如循环结构、嵌套循环,不同情况下的复杂度差异。可能用户是刚开始学习算法,所以需要例子来辅助理解,避免太抽象。另外,用户可能想知道最坏情况、平均情况这些概念的区别。有没有可能用户混淆了时间复杂度和实际执行时间?需要澄清一下,时间复杂度是增长趋势,而不是具体的执行时间。还要检查有没有常见的错误,比如忽略系数和低阶项,或者错误地简化表达式。最后,总结一下步骤,帮助用户记忆。应该用简单的中文,结构清晰,分点说明,配合例子。比如,单层循环是O(n),双层嵌套是O(),分治算法像二分法是O(log n)。可能需要提到递归的时间复杂度,比如斐波那契的递归是O(2^n),但这可能稍复杂,根据用户的理解程度决定是否深入。总之,确保内容准确,逻辑连贯,例子贴切,让用户能够逐步掌握计方法。</think>时间复杂度的计算法分析的核心内容,主要用于衡量算法运行时间随输入规模增长的变化趋势。以下是逐步讲解: --- ### 一、基本概念 1. **时间复杂度**:描述算法执行时间与输入规模(n)之间的关系,用大O符号(O)表示。 2. **核心思想**:忽略低阶项和常数系数,只保留最高阶项(例如 $O(n^2)$)。 --- ### 二、计步骤 #### 步骤1:确定基本操作 找到算法中执行次数最多的操作(如循环中的比较、赋值等)。 **示例**: ```python for i in range(n): # 循环内的打印是基本操作 print(i) ``` #### 步骤2:计执行次数 统计基本操作的执行次数,用关于n的表达式表示。 **示例**: - 单层循环:执行n次 → $T(n) = n$ - 双层嵌套循环:执行$n \times n = n^2$次 → $T(n) = n^2$ #### 步骤3:简化为大O表示 保留最高阶项,去掉系数和低阶项: - 若 $T(n) = 3n^2 + 2n + 1$ → $O(n^2)$ - 若 $T(n) = 5n + 10$ → $O(n)$ --- ### 三、常见复杂度类型 1. **常数时间**:$O(1)$ ```python x = 10 + 20 # 无循环,操作次数固定 ``` 2. **线性时间**:$O(n)$ ```python for i in range(n): # 单层循环 print(i) ``` 3. **平方时间**:$O(n^2)$ ```python for i in range(n): # 双层嵌套循环 for j in range(n): print(i, j) ``` 4. **对数时间**:$O(\log n)$ ```python while n > 1: # 二分法、折半查找 n = n // 2 ``` 5. **线性对数时间**:$O(n \log n)$ 典型应用:快速排序、归并排序。 --- ### 四、递归算法时间复杂度 通过递推公式分析,例如: - **斐波那契数列(递归)**: $$T(n) = T(n-1) + T(n-2) + O(1)$$ 时间复杂度为 $O(2^n)$(指数级)。 - **二分法(递归)**: $$T(n) = T(n/2) + O(1)$$ 时间复杂度为 $O(\log n)$。 --- ### 五、注意事项 1. **最坏情况 vs 平均情况** - 快速排序的最坏复杂度是$O(n^2)$,平均复杂度是$O(n \log n)$。 2. **空间换时间** 哈希表通过额外空间实现$O(1)$的查询复杂度。 3. **实际应用** 时间复杂度不直接等于实际运行时间,但能反映算法 scalability(扩展性)。 --- ### 六、总结 通过分析基本操作的执行次数,逐步简化为大O表达式,可快速评估算法效率。实际应用中需结合数据规模选择合适的复杂度类型。
评论 56
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的咋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值