方法:推导大O阶

进行算法效率的度量有 “事后统计方法” 和 “事前分析估算方法” 两种。

其中, “事后统计方法” 需要设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

而 “事前分析估算方法” 是在计算机程序编制前,依据统计方法对算法进行估算。

“事后统计方法” 显然有很大缺陷,例如必须依据算法事先编制好程序(需要花费大量的时间和精力)、时间的比较依赖计算机硬件和软件等环境因素(有时会掩盖算法本身的优劣)、算法的测试数据设计困难且程序的运行时间与测试数据规模有很大关系(效率高的算法在小的测试数据面前往往得不到体现)。

“事前分析估算方法” 是通过分析,发现一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于以下因素:
1.算法采用的策略、方法。
2.编译产生的代码质量。(由软件支持,如编译器优化等级)
3.问题的输入规模。
4.机器执行指令的速度。(由硬件性能决定)
也就是说,抛开这些与计算机软硬件有关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓问题输入规模是指输入量的多少。

分析一个算法的时间复杂度,等同于推导大O阶,其推导方法如下:
1.用常数 1 取代运行时间中的所有加法常数。
2.在修改后的运行次数函数中,只保留最高阶项。
3.如果最高阶项存在且不是 1,则去除与这个项相乘的常数。
得到的结果就是大O阶。

示例:

int i, j, x=0, sum=0, n=100;  // 执行 1 次
for (i=1; i<=n; i++)
{
    for (j=1; j<=n; j++)
    {
        x++;                  // 执行 n * n 次
        sum = sum + x;
    }
}
printf("%d", sum);            // 执行 1 次

该代码运行时间为 1 + n² + 1,根据推导方法步骤 1 将其计算得到 n² + 1,接着根据步骤 2 得到 ,再根据步骤 3 得到
当熟练推导大O阶之后,像这种情况可以直接得出大O阶为 O(n²)。

提示:
1.如果不理解大O阶的存在意义,可以去了解函数的渐近增长。
2.仿佛是得到了游戏攻略一样,我们好像已经得到了一个推导算法时间复杂度的万能公式。可事实上,分析一个算法的时间复杂度,没有这么简单,我们还需要多看几个例子。

以上笔记摘抄于书籍《大话数据结构》

posted @ 2020-08-19 18:51  sunck  阅读(582)  评论(0)    收藏  举报