数据结构绪论(3)

目录

 

1.3  复杂度度量

1.3.1  渐进分析

1.3.2  大O记号(O,Ω,Θ)

1.3.3  复杂度图像

1.3.3.1  增长速度

1.3.3.2  层次级别以及一些算法举例

1.3.3.3  课后思考


1.3  复杂度度量

1.3.1  渐进分析

扫描二维码关注公众号,回复: 2802282 查看本文章

1.3.2  大O记号(O,Ω,Θ)

1. 算法的效率主要看时间消耗与存储空间消耗,这里我们屏蔽存储空间的消耗,仅仅考虑时间的消耗。

2. 大O的定义:T(n) = O(f(n)) ,f(n)为一个函数。当c > 0,T(n) < c ∗ f(n),即大O记号表示T(n)的一个上界,其性质为:
        O(n) = O(c ∗ n)
        O(n^2 + n) = O(n^2)

3. 大Ω的定义:T(n) = Ω(f(n)) ,f(n)为一个函数。当c > 0,T(n) > c ∗ f(n),即大O记号表示T(n)的一个下界。

4. 大Θ的定义:T(n) = Θ(f(n)) ,f(n)为一个函数。当c1 > c2 > 0,c1 ∗ f(n) > T(n) > c2 ∗ f(n),即大O记号表示T(n)的一个区间。

5. 大O记号的分类:
        常数类:O(1) = 2 or 2018 or 2018 * 2018,有效
        对数类:O(log^c n)与常底数、常数次幂无关,复杂度接近常数,有效。
        多项式:O(n^c)
        线性:O(n)
        指数:c^n = O(2^n)任何c均可。成本增长极快,不是有效的。

6. 时间复杂度T(n) :特定算法处理规模为n的问题所需的时间,由于n相同,但T(n)不同,===>简化为:
                                        在规模为n的所有输入中选择时间最长者作为T(n),并以T(n)度量算法的时间复杂度。

7. 渐进时间复杂度:注重时间复杂度随问题规模n的增长的总体变化趋势
        大O记号(T(n)的渐进上界):
                若存在正的常数c和函数f(n),使的对任何n>>2都有: T(n) <= c  *  f(n),即认为在n足够大之后,f(n)给出了T(n)增长速度的一个渐进上界,记为:T(n) = O( f(n) )

8. 大O记号性质:
        a . 对于任一常数 c > 0, 有O( f(n) ) = O( c * f(n) )  :在大O记号意义下:函数各项正的常系数可以忽略并等同于1
        b . 对于任意常数 a > b > 0,有 O( n ^ a + n ^ b ) = O( n ^ a )  :在大O记号意义下:多项式中的低次项均可忽略

9. 空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。一个算法在计算机存储器上所占用的存储空间,包括存储算法本身所占用的存储空间,算法的输入输出数据所占用的存储空间和算法在运行过程中临时占用的存储空间这三个方面。

        算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)= O(f(n)),其中,n为问题的规模,f(n)为语句关于n所占存储空间的函数。

        一般情况下,一个程序在机器上执行时,除了需要存储程序本身的指令、常数、变量和输入数据外,还需要存储对数据操作的存储单元。若输入数据所占空间只取决于问题本身,和算法无关,这样只需要分析该算法在实现时所需的辅助单元即可。若算法执行时所需的辅助空间相对于输入数据量而言是个常数,则称此算法为原地工作,空间复杂度为O(1)。

        关于O(1)的问题, O(1)是说数据规模和临时变量数目无关,并不是说仅仅定义一个临时变量。举例:无论数据规模多大,我都定义100个变量,这就叫做数据规模和临时变量数目无关。就是说空间复杂度是O(1)。

        当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为0(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为0(n).若形参为数组,则只需要为它分配一个存储由实参传送来的一个地址指针的空间,即一个机器字长空间;若形参为引用方式,则也只需要为其分配存储一个地址的空间,用它来存储对应实参变量的地址,以便由系统自动引用实参变量。

10. 对于一个算法,其时间复杂度和空间复杂度往往是相互影响的。当追求一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,求一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间。另外,算法的所有性能之间都存在着或多或少的相互影响。因此,当设计一个算法(特别是大型算法)时,要综合考虑算法的各项性能,算法的使用频率,算法处理的数据量的大小,算法描述语言的特性,算法运行的机器系统环境等各方面因素,才能够设计出比较好的算法。

11. 通常,我们都使用“时间复杂度”来指运行时间的需求,使用“空间复杂度”指空间需求。当不用限定词地使用“复杂度”时,通常都是指时间复杂度。

1.3.3  复杂度图像

1.3.3.1  增长速度

1.3.3.2  层次级别以及一些算法举例

1.3.3.3  课后思考

通过老师视频中用数字举例,以及图像的直观感受,为了使程序或者算法更好的运行,要不断降低它的复杂度,使它能达到最优情况。书上P12 ==> P15详细的给出了各种复杂度的一个例子,很详细的讲解了各种复杂度。

猜你喜欢

转载自blog.csdn.net/qq_41074004/article/details/81603671