算法笔记(八):复杂度分析(二)

#感兴趣的能够去订阅极客时间前谷歌工程师的专栏:数据结构与算法之美,我的以为写的很不错。这里只是我本身作的一个简单的笔记算法

(一) 对数阶时间复杂度数组

1 def tset(n):
2     i = 1
3     while i <= n:
4         i = i*2

    上面这段代码,i 从1开始,循环一次乘于2,当大于n时,循环结束,咱们能够获得2x = n。要计算上面这段代码的时间复杂度,求解x的值就好了,根据数学基础中和对数相关的计算,能够获得x = log2n = logn,因此这段代码的时间复杂度就是O(logn)。数据结构

        将代码修改为下面这样,很容易计算出,代码的时间复杂度是O(log3n)。spa

1 def tset(n):
2     i = 1
3     while i <= n:
4         i = i*3

        在对数中log3n = log32*log2n,因此O(log3n) = O(log32*log2n) = O(C*log2n),其中C是常量,根据渐进符号的定义,计算时间复杂度时,咱们能够忽略常量,因此上面这段代码的时间复杂度也是O(logn),同理,全部对数阶时间复杂度的表示中,能够统一表示为O(logn)。code

   若是一段代码的时间复杂度是O(logn),若是循环运行n次,那么时间复杂度就是O(nlogn)。blog

(二) 空间复杂度索引

  下面这段代码,和分析时间复杂度同样,由于只有第三行代码建立了一个大小为n的数组,其余不是常量就是不占用内存空间,因此这段代码的空间复杂度是O(n)内存

1 def test1(n):
2     a = 0
3     arr = numpy.arange(n)
4     for i in range(n):
5         arr[i] = i*i
6     return arr

(三)  最好、最坏、平均时间复杂度数学

 这里咱们用以前线性查找的例子:class

1 import numpy as np
2 
3 #找到结果,返回索引,不然返回None
4 def search(array,key):
5     for j in range(len(array)):
6         if array[j] == key:
7             return j
8     return None

最好时间复杂度: 若是第一个元素就是咱们要查找的元素,那么代码的时间复杂度就是O(1)

最坏时间复杂度:若是最后一个元素才是咱们要查找的元素,或者数组中根本就没有咱们要查找的元素,那么代码的时间复杂度就是O(n)

平均时间复杂度:查找元素在是否在数组中有2种状况,在数组中(0...n-1)和不在数组中,那么总共就有 n+1种状况,咱们将须要查找的元素(可能运行的次数,第n个元素和不在数组中运行次数都是n次)相加除以n+1就能够获得代码的时间复杂度。

(1+2+3...+n+n)/ (n+1) = (n*(n+2))/2(n+1),那么平均时间复杂度为O(n)。

1+2+3...+n  能够推导出公式 n(n+1)/2,详细推导过程不明白的能够本身网上查查资料。

相关文章
相关标签/搜索