算法的复杂度

458 阅读2分钟

时间复杂度

我们平时编程的时候,怎么判断哪些代码块运行时间最短,用什么方式来体现算法运行的快慢呢?

这就用到了时间复杂度。时间复杂度就是用来评估算法运行效率的一个度量,或者说是一个式子。

我们来看以下例子:

例子一:时间复杂度为 O(1)

print("Hello World")

例子二:时间复杂度为 O(n)

for i in range(n):
    print("Hello World")

例子三:时间复杂度为 O(n2n^2)

for i in range(n):
    for j in range(n):
        print("Hello World")

例子四:

n = 64
while n > 1:
    print(n)
    n = n // 2   # n整除2

我们来看下例子四,根据代码算法,举个例子,比如:26=642^6=64,则log264=6{log_2{64}}=6,所以这里的时间复杂度记为O(log2n{log_2{n}})或O(logn{log_{n}})

时间复杂度小结

  • 时间复杂度是用来估计算法运行时间的一个度量或单位式子
  • 一般来说,时间复杂度高的算法比复杂度底的算法慢
  • 常见的时间复杂度(按效率排序)
O(1) > O(${log_{n}}$) > O(n) > O(n${log_{n}}$) > O($n^2$) > O($n^3$)

快速判断算法复杂度

适用于绝大多数简单的情况:

  • 确定问题规模 n,比如说对于列表的排序,问题规模就是列表的长度了
  • 循环减半过程 logn,看算法是否有循环减半的过程
  • k 层关于 n 的循环 n的k次方

复杂情况:根据算法执行过程以及含义来进行判断

空间复杂度

空间复杂度:用来评估使用算法时内存占用大小的度量。

空间复杂度的表达方式与时间复杂度的完全一样:

  • 算法使用了几个变量:O(1)
  • 算法使用了长度为 n 的一维列表:O(n)
  • 算法使用了 m 行 n 列的二维列表:O(mn)

我们在平时开发中所说的算法复杂度时,往往就是指时间复杂度,需要考虑用空间来换时间了,大部分都是考虑到时间是比空间重要,因为空间是可以用机器设备来维持的,比如;加内存条,加磁盘等,而时间是有限且等不及的。