zoukankan      html  css  js  c++  java
  • 第4课 程序灵魂的审判

    1. 算法效率的度量

    (1)事后统计法

      ①通过设计好的测试程序和数据,比较不同算法对同一组输入数据的运行处理时间

      ②主要缺陷

        A.为了获得不同算法的运行时间,必须编写好测试程序

        B.运行时间严重依赖硬件以及运行时的环境因素

        C.算法的测试数据选取和设计困难,并且程序的运行时间往往还与测试数据的规模有关。效率高的算法在小的测试数据面前往往得不到体现。

    (2)事前分析估算

      ①依据统计的方法对算法效率进行估算

      ②影响算法效率的主要因素

        A.算法采用的策略和方法(这是算法好坏的根本)

        B.问题的输入规模(指的是输入量的多少)

        C.编译产生的代码质量(由软件来支持)

        D.机器执行指令的速度(看硬件性能)

    2. 算法效率的估计

    (1)简单估算1:

     

    (2)简单估算2:

     

    (3)简单估算3:

     

    (4)启示

     

      ①三种求和算法中关键部分的操作数量分别为2n、n和1

      ②随着问题规模n的增大,它们操作数量的差异会越来越大,因此实际算法在效率上的差异也会变得非常明显!

    【实例分析】程序效率估算

    #include <iostream>
    
    using namespace std;
    
    int func(int a[], int len)  // ==>(n*n + 2)
    {
        int ret = 0;       //1
        
        for(int i=0; i<len; i++)
        {
            for(int j=0; j<len; j++)
            {
                //程序关键部分的操作数量为n*n
                ret += a[i] * a[j];  //n * n
            }
        }
        
        return ret;    //1
    }
    
    int main()
    {
        int array[] = {1, 2, 3, 4, 5};
        
        cout << func(array, 5) << endl; //255
        
        return 0;
    }

    3. 函数的渐近增长

    (1)算法操作数据对比1

    次数

    A(4n+8)

    A´(n)

    B(2n2+1)

    B´(n2)

    n=1

    12

    1

    3

    1

    n=2

    16

    2

    9

    4

    n=3

    20

    3

    19

    9

    n=10

    48

    10

    201

    100

    n=100

    408

    100

    20001

    10000

    n=100

    4008

    1000

    2000001

    1000000

    【结论】

      ①n<=3时,算法B(2n2+1)优于算法A(4n+8)

      ②当n越来越大的时候,算法A(4n+8)相对算法B(2n2+1)的优势明显

    (2)算法操作数量的对比2

    次数

    C(2n2+3n+1)

    C(n2)

    D(2n3+3n+1)

    D(n3)

    n=1

    6

    1

    6

    1

    n=2

    15

    4

    23

    8

    n=3

    28

    9

    64

    27

    n=10

    231

    100

    2031

    1000

    n=100

    20301

    10000

    2000301

    100000

    【结论】

      ①n==1时,算法C(2n2+3n+1)和算法D(2n3+3n+1)的操作数量相同。

      ②当n越来越大的时候,算法C(2n2+3n+1)的效率远高于算法D(2n3+3n+1)

    (3)算法操作数量的对比3

    次数

    E(2n2)

    F(3n+1)

    G(2n2+3n+1)

    n=1

    2

    4

    6

    n=2

    8

    7

    15

    n=5

    50

    16

    66

    n=100

    20000

    301

    20301

    n=10000

    200000000

    30001

    200030001

    n=100000

    20000000000

    300001

    20000300001

    n=1000000

    2000000000000

    3000001

    2000003000001

    【结论】

      ①判断一个算法的效率时,操作数量中的常数项其他次要项常常可以忽略,只需要关注主项(最高阶项)就能得出结论。

      ②判断一个算法的好坏,只通过少量的数据是不能做出准确判断的。随着问题规模n的增大,某个算法会越来越优于另一个算法,或越来越差于另一个算法。这就是事前估算方法的理论依据。

    4. 小结

    (1)算法的度量有事后统计法事前分析估算法

    (2)事后统计法不容易准确度量算法的效率

    (3)事前分析估算法通过操作数量度量算法效率

    (4)判断一个算法效率时,只需关注最高阶项就能得出结论

    (5)某个算法,随着问题规模n的增大,它会越来越优于另一算法,或者越来越差于另一算法

  • 相关阅读:
    Sprinig.net 双向绑定 Bidirectional data binding and data model management 和 UpdatePanel
    Memcached是什么
    Spring.net 网络示例 codeproject
    jquery.modalbox.show 插件
    UVA 639 Don't Get Rooked
    UVA 539 The Settlers of Catan
    UVA 301 Transportation
    UVA 331 Mapping the Swaps
    UVA 216 Getting in Line
    UVA 10344 23 out of 5
  • 原文地址:https://www.cnblogs.com/5iedu/p/6181918.html
Copyright © 2011-2022 走看看