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

算法的时间复杂度指算法运行所需要的时间,空间复杂度指的是算法所需要的内存空间。

一、时间复杂度

算法的时间复杂度是一个函数,用大写字母O来表示,它描述的是数据量的增长导致的时间增长情况。例如O(2n)和O(n)是相同类型的时间复杂度,因为在数据量增加一倍的时候,时间开销都是增长一倍(线性增长)的。O(n^2)和O(n)是不同类型的时间复杂度,因为扩大一倍,前者时间消耗扩大四倍。且随着数据量的增长,算法时间消耗的增长受n的最高项的影响最大。如果一个算法对于任何大小为n的输入,至多需要5 n^ 3+3n的时间运行完毕,那么它的时间复杂度为O(n^3)。

一般认为一个基本的运算为一次操作,如加减乘除判断等,通常假设一个基本操作可在固定时间内完成,因此总运行时间相当于操作的总数量。下面对常见的时间复杂度进行概述分析。

1)常数时间复杂度

对于一个算法,若运行时间与输入大小无关,则称其具有常数时间复杂度,记作O(1)。一个例子是访问数组中的单个元素,因为访问它只需要一条指令。但是,找到无序数组中的最小元素不是,因为这需要遍历所有元素来找出最小值。

运行时间本身可以与问题规模有关,但它的上界必须是与问题规模无关的确定值。如果时间复杂度为O©,其中c是一个常数,这记法等价于标准记法O(1).

2)线性时间复杂度

线性时间复杂度的算法运行时间长短与输入呈线性关系,一般记为O(n)。如找到无序数组中的最小元素为线性时间复杂度,因为需要遍历所有元素来找出最小值。计算n个元素的和,需要遍历所有元素,把元素的值累加起来之后返回n个元素的和,所以时间复杂度为O(n),n为元素的个数。

3)对数时间复杂度

即为O(log2 n )为标准记法,数据结构中的线段树,基本算法中的分治和二分查找都是对数时间复杂度。逐次平方求解a^b mod p 的值,它的时间复杂度为O(log 2 b),其中b为a的幂的数量级。

4)指数时间复杂度

根据输入数据量大小n而呈指数增长,则称该算法具有指数时间复杂度。即为O(2^O(n)),常见的NP问题的算法时间复杂度是指数时间复杂度,如动态规划求解的普通图——哈密顿回路问题等。

例如,从n个数中选择一些数,共有多种选择方法。可以把每种选法下选出来的数字的集合看成一个二进制数字,如果选择第i个数,则二进制的第i位为1,反之为0.这样每一种选法都对应着唯一一个数的二进制表示,每一个二进制都对应着一种选法。对于每个二进制数,需要计算所有选择的数字之和,和为0返回false,否则返回true。所以这段代码的时间复杂度为O(n×2^n)。

5)阶乘时间复杂度

即为O(n!),即算法的时间消耗根据输入数据的大小n而呈“n!”数量级增长。常见的具有阶乘时间复杂度的算法大部分是一些蛮力搜索问题和排列组合的求解,如生成n个数的全排列算法等。

如输出1至n的全排列,对于n个不同的数来说,共有n!种排列方式,所以时间复杂度为(n×n!)。

6)根号时间复杂度

即算法的时间消耗根据输入数据的大小n而成根号n的数量级增长。常见的具有根号时间复杂度的算法有:分解质因数和求解区间操作问题等。
例如如果n是一个合数,那么n一定有一个因子在2和根号n之间,返回这个数;如果n是一个素数,那么没有因子在2和根号n之间,返回n。算法时间复杂度为O(根号n)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值