时间复杂度(详解)

本文讲解了时间复杂度的基本概念,通过实例阐述了O(n)、O(n^2)和O(log n)等复杂度,并重点探讨了递归函数的主定理及其应用,包括二分查找、二叉树遍历等常见场景。提升编程效率,理解算法复杂度至关重要。

开始之前有两个知识点要明确一下:
1、时间复杂度可以根据程序运行的次数来判断
2、时间复杂度的系数可以忽略
比如下面这个例子:在这里插入图片描述
第一种情况程序只运行了一次,第二种情况程序运行了三次所以应该是O(3*1)=O(3),而系数可以忽略,所以最终结果就是O(1).

下面是常用的几种时间复杂度
在这里插入图片描述
接着我们还是举例子来看,下面的第一个程序循环了n次,所以它的时间复杂度是O(N),如果n等于5那么,就执行了5次,那么时间复杂度就是O(5),也就是常数复杂度O(1)。
第二个我们发现它是一个循环中又嵌套了一个循环,而且两次循环的次数都是n所以它的时间复杂度就是n的平方,因为i=1时要输出n次,等于2的时候也要输出n次…所以是n个n相加那就是n 乘n也就是n的平方,如果再嵌套一个n次的循环它就是n的三次方。
在这儿我们做一下小拓展,就是如果我们把第二个程序的两个循环改成并列关系,那么它的时间复杂度又是多少呢?
毫无疑问它执行了n次,又执行了n次,那就是2n次,根据上面的规则时间复杂度就是O(N)。
简而言之,也就是如果是嵌套执行,嵌套几次时间复杂度就是O(n的多少次方)
不管并列多少次,它的时间复杂度都是O(N)
在这里插入图片描述
我们还是接着看例子,如果我们把第一个程序的n改为4,那么这个函数体执行几次呢?大家不妨找张纸算一算,其实挺简单的,你只要明白4<4是不成立的就行,哈哈哈哈哈,所以他是执行了2次,所以他的执行次数就是log(n),那么时间复杂度就是O(log(n))这儿是以2为底的。
第二个是斐波那契数列代表的递归的时间复杂度,我们在后面讲
在这里插入图片描述
时间复杂度曲线
在这里插入图片描述
我们可以看到当n小于5的时候时间复杂度其实都是差不多的,但是随着n越来越大,你会发现指数级的它涨的是非常快的,也就是大家在写程序的时候如果可以将一个时间复杂度为2的n次方,降到n的平方,那么你的收益是非常高的。
所以我们需要反复强调一个点,就是大家在写程序的时候一定要对自己程序的时间复杂度和空间复杂度有所了解,而且是养成习惯,写完了以后能够下意识的分析出这段程序的时间和空间复杂度,还有就是能够用最简洁的时间,空间复杂度完成这段程序的话,基本上是一个顶尖职业选手的必备素养。
下面我们来看递归函数的时间复杂度
为了更好的表示我们进行递归的过程,我们需要画一个叫做递归树的东西来辅助我们理解整个程序
下面我们来看一个例子
在这里插入图片描述
这是一个求斐波那契数列的第n项的函数,我们来看它的时间复杂度,假如n等于6,那么直接跳到
fib(5)+fib(4)在这里插入图片描述
而分别求5和4的时候又要分成两步,我们看上面这个树状图,每一次每个结点都要分成两步,也就是第一层只有1个,第二层变成两个,第三层变成四个,第四层变成八个,也就是指数函数被。在这里插入图片描述
主定理
主定理是用来计算递归函数的时间复杂度的,下面给出了四种常用算法的时间复杂度
在这里插入图片描述分别是
1、二分查找,一般发生在一个有序数列中找到你要的目标数,所以它每次都一分为二,只查一边
2、二叉树的遍历,相当于把每个元素访问了有且仅有一遍
3、有序二维矩阵的二分查找
4、归并排序

在这里插入图片描述
上面四种情况,除了二分查找的时间复杂度是logn以外,其他三种的时间复杂度均为O(N),因为要访问有且仅有一次其中的结点,其中的N为结点数。

以上图片来自极客时间

<think>嗯,用户想了解如何通过代码分析时间复杂度。首先,我需要回忆一下时间复杂度的基本概念和计算方法。根据引用[1]和[2],时间复杂度是描述算法运行时间的函数,通常用大O表示法,忽略低阶项和系数。分析的时候需要逐行代码检查,尤其是循环和嵌套结构。 用户可能需要具体的步骤和例子,所以应该分步骤说明,比如先看基本操作,再处理循环、条件语句等。比如引用[2]提到,赋值、算术运算都是O(1),循环次数n的话是O(n),嵌套循环则是O(n^m)。需要把这些方法用实际的代码例子来展示。 然后,用户给的示例可能包括不同的结构,比如顺序结构、循环、分支等,我应该分别举例说明。例如,单层循环是O(n),双重循环是O(),还有分治算法比如递归的快速排序,这时候时间复杂度可能是O(n log n)。需要结合引用中的方法,比如逐步分析法。 另外,要注意特殊情况,比如循环变量不是简单的递增,而是乘以或除以某个数,这时候循环次数可能是对数级别。例如,循环变量i每次乘以2,那么次数是log₂n,对应O(log n)。还有可能遇到多个循环并列的情况,这时候时间复杂度是相加,取最高阶的项。 用户可能对递归算法的时间复杂度分析有疑问,这时候需要引入递归树或者主定理的方法。比如快速排序的平均情况是O(n log n),而最坏情况是O(),需要解释基准选择的影响。这部分可以引用示例中的快速排序代码,并参考引用[1]中的分治策略分析。 还要注意区分时间复杂度和空间复杂度,但用户的问题主要集中在时间复杂度上。在例子中,可能需要对比不同算法的时间复杂度,比如顺序查找O(n)和二分查找O(log n),让用户更清楚如何分析。 最后,总结步骤,帮助用户系统地分析代码。例如,首先识别基本操作,然后分析循环结构,处理分支语句,递归的情况等。确保每个步骤都有对应的例子,比如引用[4]中的Func3函数,两个独立的循环,时间复杂度是O(M + N)。 可能用户在实际操作中会遇到复杂的代码结构,需要分解各部分的时间复杂度,再综合起来。例如,多个嵌套循环和条件语句的组合,这时候需要逐步拆解,分别计算各部分的时间复杂度,再合并处理。 总之,回答需要结构清晰,步骤明确,结合具体代码示例,并引用相关的资料来支持分析过程,确保用户能够理解并应用这些方法。</think>### 时间复杂度的代码分析方法 时间复杂度的分析主要通过 **逐行代码解析** 和 **结构特征识别** 实现。以下是具体步骤和示例说明: --- #### **步骤1:识别基本操作** - **基本操作**(如赋值、比较、算术运算)的时间复杂度为 $O(1)$。 - 示例: ```python a = 10 # O(1) b = a + 5 # O(1) if a > b: # O(1) print("Yes") ``` --- #### **步骤2:分析循环结构** 1. **单层循环**:循环次数与输入规模 $n$ 线性相关。 ```python for i in range(n): # 循环次数为 n → O(n) print(i) # O(1) ``` **总时间复杂度**:$O(n) \times O(1) = O(n)$ 2. **嵌套循环**:循环次数为各层循环次数乘积。 ```python for i in range(n): # O(n) for j in range(n): # O(n) print(i + j) # O(1) ``` **总时间复杂度**:$O(n) \times O(n) \times O(1) = O(n^2)$ --- #### **步骤3:处理分支语句** - **条件分支**:取时间复杂度的最大路径。 ```python if condition: for i in range(n): # O(n) print(i) else: print("No") # O(1) ``` **总时间复杂度**:$\max(O(n), O(1)) = O(n)$ --- #### **步骤4:递归算法分析** - **递归调用次数**与递归深度相关。 - **示例:快速排序** ```python def quick_sort(arr): if len(arr) <= 1: # O(1) return arr pivot = arr[0] left = quick_sort([x for x in arr[1:] if x < pivot]) # T(n/2) right = quick_sort([x for x in arr[1:] if x >= pivot]) # T(n/2) return left + [pivot] + right ``` - **递推关系**:$T(n) = 2T(n/2) + O(n)$ - **时间复杂度**:$O(n \log n)$(平均情况)[^1] --- #### **步骤5:综合复杂结构** - **多段循环**:时间复杂度为各段之和,取最高阶项。 ```python for i in range(n): # O(n) print(i) for i in range(n): # O(n) for j in range(n): # O(n) print(i + j) ``` **总时间复杂度**:$O(n) + O(n^2) = O(n^2)$ --- ### **关键技巧总结** 1. **循环变量变化规律**:例如 `i *= 2` 的循环次数为 $O(\log n)$。 2. **分治算法**:通过递推公式(如主定理)计算时间复杂度[^1]。 3. **空间换时间**:哈希表、缓存等优化可能降低时间复杂度[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CFuYuan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值