数据结构和算法----复杂度分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bquau/article/details/88840601

一、大O复杂度表示法

1、从CPU的角度来看,每段代码都执行着类似的操作,读数据运算写数据。尽管每行代码对应的CPU执行的个数,执行的时间都不一样,我们只是粗略估计所以可以假设每行代码的执行时间都一样为unit_time

2、代码的时间复杂度总结成公式为:T(n) = O(f(n))

   T(n):表示代码的执行的时间

   n:表示数据规模的大小

   f(n):表示每行代码执行的次数总和

   O:表示T(n)F(n)成正比

    3、大O时间复杂度表示法,并不是表示代码真正的执行时间,而是表示代码执行时间随数据规模变化而变化的趋势。也叫(渐近时间复杂度)

二、时间复杂度分析

1、只关注循环执行次数最多的一段代码

   因其只表示代码执行时间的随数据规模变化的变化趋势,所以我们通常会忽略一些量级较低的代码。比如常量和低阶项。只分析最大阶的量级就好了。所以在分析的时候只关注循环次数最多的那一段代码就可以了。

2、总复杂度等于量级最大的那段代码的复杂度

3、嵌套代码的复杂度等于嵌套内外代码复杂度的乘积。

   例如:两个for循环嵌套。

三、时间复杂度排序

    O(1) < O(log^n) < O(n) < O(nlog^n) < O(n^2) < O(n^3) < O(2^n)

四、python示例

O(1):

a = 1

b = 2

sum = a+b

O(log^n):

C = 1

while c <= n:

    c = c * 2

O(n):

for i in range(n):

   print(i)

O(nlog^n):

for i in range(n):

      C = 1

while c <= n:

       c = c * 2

O(n^2):

for i in range(n):

for i in range(n):

O(n^3):

就是O(n^2)再套个循环

O(2^n):

  def PowerSetsBinary(items):

    N = len(items)

    for i in range(2 ** N):

        combo = []

        for j in range(N):

           if (i >> j) % 2:

                combo.append(items[j])

        print(combo)

五、最好,最坏时间复杂度

1、最好,最坏时间复杂度

例如从集合中找到某一元素的位置。

def find(lis,data):

   for index,i in enumerate(lis):

      if i == data:

        return index

   return None        

如果集合中第一个元素就是要找的元素那么,时间复杂度为O(1)。如果在集合中没有该元素那么时间复杂度为O(n)。在不同情况下时间复杂度不同。为了表示不同情况的时间复杂度,我们引入三个概念:最好时间复杂度,最坏时间复杂度和平均情况时间复杂度。

最好时间复杂度就是,在最理想的情况下,执行这段代码的时间.

最坏时间复杂度就是,在最糟糕的情况下,执行这段代码的时间复杂度

2、平均时间复杂度

拿上面代码来举例,要查找data在集合中的位置有n+1种情况,在数组的位置中和不再集合中概率为1/2。在数组中的话出现在0---n-1中某一位置的概率为1/n。根据概率乘法法则要查找的数据出现在0—n-1位置的概率就为1/2n

公式大概是这样的

https://static001.geekbang.org/resource/image/36/7f/36c0aabdac69032f8a43368f5e90c67f.jpg

这个值在概率论中叫加权平均值也叫期望值

省略掉系数,低阶,常量。得到时间复杂度为O(n)

3、均摊时间复杂度

def test(count,lis):

    if count == len(lis):

        for i in range(len(lis)):

            print(i)

        count = 0

        break

    else:

        count += 1

上面代码只为说明,分析上面代码后可知进行n-1次的O(1)操作之后会进行一次O(n)的操作

针对这种特殊的场景,我们引入了一种更加简单的分析方法:摊还分析法,通过摊还分析得到的时间复杂度我们叫均摊时间复杂度

n-1O(1)操作都会跟着一次O(n)操作。把耗时多的那次操作均摊道耗时少的n-1次操作中。均摊下来得到的均摊时间复杂度就为O(1)。例子不太准确不过大概能说名思路。

本文由博主学习总结而来,如果有错误的地方请指正。有多处借鉴!借鉴于

https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzI5OTIyMjQxMA==&scene=124#wechat_redirect

https://time.geekbang.org/column/article/40961

万分感谢马老师和王争大佬的知识分享!

猜你喜欢

转载自blog.csdn.net/bquau/article/details/88840601