浅谈算法时间复杂度

转自:微点阅读  https://www.weidianyuedu.com/content/5317491549851.html

今天来简单聊聊算法复杂度这个概念,算法复杂度包含时间复杂度和空间复杂度二个方面。

时间复杂度:评估执行程序所需的时间。可以估算出程序对处理器的使用程度。空间复杂度:评估执行程序所需的存储空间。可以估算出程序对计算机内存的使用程度。

因为时间复杂度要比空间复杂度更容易产生问题也更有优化的价值,一般说来,不特别说明,复杂度就是指时间复杂度。

时间复杂度及其标示法

一般说来,一个算法要执行所耗费的时间,你不去机器上运行一下,是不可知的,即使你去机器上运行,每次执行所耗费的时间也应该是不一样的。但是我们怎么知道那个算法耗费的时间多那个耗费的时间少呢?这个就要看你设计的算法运行一次所执行的文库资料关键语句次数的多少了,如果你的算法执行的关键语句次数多,那么算法花费的整体时间就多,相反时间就少。我们把关键语句执行次数【也叫问题规模】记做n,则算法总运行时间可以记做T(n)。计算机中我们经常用O(n)来标示时间的复杂度,其中n为问题规模。

几种常见的时间复杂度及示例

需要说明的是,根据输入数据的不同,一般会有最好时间复杂度,最坏时间复杂度和平均时间复杂度。我们设计算法时不能指望输入数据每次都是最优的,因此,考虑到输入数据的随机性,我们一般care平均时间复杂度。当然,在生产环境遇到实际问题时,你要实际分析你的数据,设计最符合你当前数据的算法。

  1. 常数时间复杂度O(1)

print("hello world!")
  1. 对数时间复杂度O(log(n))

# 最典型的例子就是二分查找。for (i=0; i<n; i=i*2) {  print(i)}
  1. 线性时间复杂度O(n)

# 二叉树的遍历也是线性时间复杂度,因为每个节点只处理一次。for (i=0; i<n; i++) {  print(i)}
  1. 线性对数阶时间复杂度O(nlog(n))

# 快速排序的复杂度就是线性对数阶时间复杂度for (i=0; i<n; i++) {  for (j=0; j<i; j=i*2) {    print(i, j)  }}
  1. 平方时间复杂度O(n^2)

# 说白了就是二层循环for (i=0; i<n; i++) {  for (j=0; j<n; j++) {    print(i, j)  }}
  1. 立方时间复杂度O(n^3)

# 说白了就是三层循环for (i=0; i<n; i++) {  for (j=0; j<n; j++) {    for (k=0; k<n; k++) {      print(i, j, k)    }  }}
  1. 指数时间复杂度O(2^n)

# 斐波那契数列了解下。for (i=0; i<math.pow(2,n); i++) {  print(i)}
  1. 阶乘时间复杂度O(n!)

# n! = 1 × 2 × ··· × n (n≥1)for (i=0; i<factorial(n); i++) {  print(i)}

算法时间复杂度示意图

各算法时间复杂度排序:

O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值