MIT 6.001X 2016 (11)算法复杂度 big O()

MIT 6.001X 2016 (11)算法复杂度 big O()


MIT 6.001X 2016 (11)算法复杂度 big O()


用  O( ) 来描述最坏的情况  表示的是 程序的step 关于 输入的size 的增长率 


e.g.

MIT 6.001X 2016 (11)算法复杂度 big O()

抓住主要矛盾,忽略次要矛盾

MIT 6.001X 2016 (11)算法复杂度 big O()

具体主次矛盾顺序:

MIT 6.001X 2016 (11)算法复杂度 big O()

(这个c 要指明)

具体计算的小tips: 

加法法则和乘法法则


MIT 6.001X 2016 (11)算法复杂度 big O()

MIT 6.001X 2016 (11)算法复杂度 big O()

总的来说   就是把一个大块的程序,分成一个个小块 ,然后分别计算他们的 O( )  然后加起来,取主要矛盾

如果遇见 嵌套的 那就两个乘起来

加法取主要矛盾 ,乘法忽略 常数系数

MIT 6.001X 2016 (11)算法复杂度 big O()


MIT 6.001X 2016 (11)算法复杂度 big O()


MIT 6.001X 2016 (11)算法复杂度 big O()


从上面这个例子我们可以看出 当一次stage  调用 两个及多个的时候 其实是O(n^c)  复杂度  

MIT 6.001X 2016 (11)算法复杂度 big O()

要注意 这个这个复杂度 是指 输入的什么size  假如是数字 一般默认大小  假如序列一般默认 是length

  


O(1):(a)复杂度与输入无关

       (b)只有很少的算法满足条件,但是很多算法的 部分代码 是这个复杂度

       (c)循环和递归也可能是这个复杂度的,但循环或者调用的 次数跟输入无关

MIT 6.001X 2016 (11)算法复杂度 big O()

O(logn):

(1)二分法查找,(任何每一步把搜索的空间分为一半(一半是泛指))

  (2)  每一次循环  输入n都要除以某个常数c, 然后循环的条件是 输入满足某个条件 (大于等于0 etc)就是O(logn)  (在具体一点  log以c为底) 

reducing the size of  problem by a constant factor on each stage 

MIT 6.001X 2016 (11)算法复杂度 big O()

e.g.

MIT 6.001X 2016 (11)算法复杂度 big O()


MIT 6.001X 2016 (11)算法复杂度 big O()



O(n):

(1) 最典型的例子是循环 然后每次循环, 那个条件变量都 用加减 一个常数

MIT 6.001X 2016 (11)算法复杂度 big O()


MIT 6.001X 2016 (11)算法复杂度 big O()


MIT 6.001X 2016 (11)算法复杂度 big O()


O(nlogn):


MIT 6.001X 2016 (11)算法复杂度 big O()



O(n^c):

(1) 大部分n的c次方复杂度的算法都是n的二次方

(2) 比较典型的有内嵌循环和递归

MIT 6.001X 2016 (11)算法复杂度 big O()

MIT 6.001X 2016 (11)算法复杂度 big O()



O(c^n):


MIT 6.001X 2016 (11)算法复杂度 big O()




总结:

MIT 6.001X 2016 (11)算法复杂度 big O()

对于list 来说 index store len  append  这些操作都是O(1)  因为  python  知道怎么找到那个点 然后 干点啥事

但是对于字典来说  基本都是O(n)  因为字典是 无序的,排序不固定 而list 是固定的

MIT 6.001X 2016 (11)算法复杂度 big O()


MIT 6.001X 2016 (11)算法复杂度 big O()

MIT 6.001X 2016 (11)算法复杂度 big O()