计算算法复杂度

算法的复杂度分为时间复杂度和空间复杂度

1.时间复杂度

在计算算法复杂度时一般只用到大O符号,Landau符号体系中的小o符号、Θ符号等等比较不常用。这里的O,最初是用大写希腊字母,但现在都用大写英语字母O;小o符号也是用小写英语字母o,Θ符号则维持大写希腊字母Θ。

常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)


求解算法的时间复杂度的具体步骤是:

  ⑴ 找出算法中的基本语句;

  算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。

  ⑵ 计算基本语句的执行次数的数量级;

  只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。

  ⑶ 用大Ο记号表示算法的时间性能。

  将基本语句执行次数的数量级放入大Ο记号中。

  如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加.


分析 :

(1).对于一些简单的输入输出语句或赋值语句,近似认为需要O(1)时间

(2).对于顺序结构,需要依次执行一系列语句所用的时间可采用大O下"求和法则"

求和法则:是指若算法的2个部分时间复杂度分别为 T1(n)=O(f(n))和 T2(n)=O(g(n)),则 T1(n)+T2(n)=O(max(f(n), g(n)))

特别地,若T1(m)=O(f(m)), T2(n)=O(g(n)),则 T1(m)+T2(n)=O(f(m) + g(n))

(3).对于选择结构,如if语句,它的主要时间耗费是在执行then字句或else字句所用的时间,需注意的是检验条件也需要O(1)时间

(4).对于循环结构,循环语句的运行时间主要体现在多次迭代中执行循环体以及检验循环条件的时间耗费,一般可用大O下"乘法法则"

乘法法则: 是指若算法的2个部分时间复杂度分别为 T1(n)=O(f(n))和 T2(n)=O(g(n)),则 T1*T2=O(f(n)*g(n))

(5).对于复杂的算法,可以将它分成几个容易估算的部分,然后利用求和法则和乘法法则技术整个算法的时间复杂度

另外还有以下2个运算法则:(1) 若g(n)=O(f(n)),则O(f(n))+ O(g(n))= O(f(n));(2) O(Cf(n)) = O(f(n)),其中C是一个正常数





2.空间复杂度

空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。



原文链接:http://blog.youkuaiyun.com/xiaoxiaopengbo/article/details/51583386
<think>嗯,用户想知道如何计算算法的时间和空间复杂度。我得先回忆一下相关知识。记得时间复杂度和执行次数有关,对吧?比如说,循环的次数会影响时间复杂度。比如一个单层循环,执行n次的话,时间复杂度应该是O(n)。如果是嵌套循环,比如两层循环,那可能就是O(n²)了。但有时候循环次数不是简单的n次,比如可能有变量变化,这时候需要仔细分析循环条件。 然后,空间复杂度的话,主要是看算法运行时占用的额外空间。比如,如果算法里用了数组,数组的长度是n,那空间复杂度就是O(n)。不过像递归这种情况,要考虑调用栈的深度,递归的深度如果是n的话,空间复杂度就是O(n)。 用户提供的引用里提到,时间复杂度用大O表示法,关注的是执行次数的量级,而不是精确时间。这很重要,比如忽略常数项和低次项,只保留最高阶的项。比如3n² + 2n +5,这里的时间复杂度就是O(n²)。 另外,引用里还提到快速排序的时间复杂度平均是O(n log n),最坏是O(n²),空间复杂度是O(log n)到O(n)。这说明不同的算法结构会导致不同的复杂度。需要根据具体代码结构来分析。 可能还需要举几个例子,比如常见的时间复杂度类型:O(1), O(log n), O(n), O(n log n), O(n²)等。比如二分查找是O(log n),因为每次循环数据量减半。而冒泡排序是O(n²)因为双重循环。 用户可能需要具体的计算步骤,比如如何从代码中推导出复杂度。例如,找出循环的层数和循环变量的变化方式。如果是递归的话,可能需要用递归方程来解时间复杂度,比如主定理之类的。 还要注意空间复杂度中的临时变量和递归调用栈的情况。比如斐波那契数列的递归实现,空间复杂度是O(n),因为每次递归调用都会占用栈空间。 总结的话,应该分步骤说明时间复杂度和空间复杂度计算方法,用例子来展示,比如循环、条件语句、递归等情况下的处理方式,并引用提供的资料来支持解释。同时,可能还需要提醒用户常见错误,比如忽略循环条件的变化或者递归深度的影响。</think>### 算法时间复杂度和空间复杂度计算方法 #### 一、时间复杂度计算 **定义**:算法中基本操作的执行次数,表示输入规模$n$的增长率关系,用大$O$符号表示[^2][^3]。 **核心步骤**: 1. **统计基本操作次数** 例如:循环中的操作次数、条件判断的执行频率。 ```python for i in range(n): # 执行n次 print(i) # 基本操作次数为n ``` 此时时间复杂度为$O(n)$。 2. **分析循环结构** - **单层循环**:若循环次数为$n$,时间复杂度为$O(n)$。 - **嵌套循环**:若两层循环次数均为$n$,时间复杂度为$O(n^2)$。 ```python for i in range(n): # 外层循环n次 for j in range(n): # 内层循环n次 print(i, j) # 总次数为n×n = n² ``` 3. **处理条件分支** 取分支中时间复杂度最高的路径: ```python if condition: for i in range(n): # O(n) else: print("no loop") # O(1) ``` 最终时间复杂度为$O(n)$。 4. **递归算法** 通过递推公式或主定理计算。例如快速排序平均时间复杂度为$O(n \log n)$[^5]。 **常见时间复杂度分类**(从优到劣): - $O(1)$:常数时间(如数组访问) - $O(\log n)$:对数时间(如二分查找) - $O(n)$:线性时间(如遍历数组) - $O(n \log n)$:线性对数时间(如归并排序) - $O(n^2)$:平方时间(如冒泡排序) --- #### 二、空间复杂度计算 **定义**:算法运行过程中临时占用的存储空间大小,同样用大$O$表示[^4]。 **核心步骤**: 1. **统计额外空间使用** 例如:数组、变量、递归调用栈。 ```python arr = [0] * n # 占用O(n)空间 ``` 2. **分析递归调用** 递归深度决定空间复杂度。例如斐波那契数列递归实现的空间复杂度为$O(n)$[^4]: ```python def fib(n): if n <= 1: return n return fib(n-1) + fib(n-2) # 递归深度为n,调用栈空间O(n) ``` 3. **忽略低阶项和常数** 例如同时使用$O(n)$和$O(1)$空间,最终空间复杂度为$O(n)$。 **常见空间复杂度示例**: - $O(1)$:原地排序(如冒泡排序) - $O(n)$:需要额外数组(如归并排序) - $O(\log n)$:快速排序递归栈[^5] --- #### 三、对比示例 | 算法 | 时间复杂度(平均) | 空间复杂度 | |------------|--------------------|-------------| | 冒泡排序 | $O(n^2)$ | $O(1)$ | | 快速排序 | $O(n \log n)$ | $O(\log n)$ | | 二分查找 | $O(\log n)$ | $O(1)$ | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值