总结:本小节讲述了近似运算时间、增长数量级和成本模型的概念以及算法的分析方法。
重点:
1. Knuth的基本见地很简单--一个程序运行的总时间主要和两点有关:
· 执行每条语句的耗时;
· 执行每条语句的频率。
前者取决于计算机、Java编译器和操作系统,后者取决于程序本身和输入。
如果对于程序的所有部分我们都知道了这些性质,可以将它们相乘并将程序中所有指令的成本相加得到总运行时间。
如果我没理解错误,我们主要研究的是执行每条语句的频率。
2. 我们常常使用约等于号(~)来忽略较小的项,从而大大简化我们所处理的数学公式。
该符号使我们能够用近似的方法忽略公式中那些非常复杂但幂次较低,且对最终结果的贡献无关紧要的项。
例如:
N(N-1)(N-2)/6 = N^3/6-N^2/2+N/3 ~ N^3/6
3. 定义:
· 我们用~f(N)表示所有随着N的增大除于f(N)的结果趋近于1的函数。
· 我们用g(N) ~ f(N)表示g(N)/f(N)随着N的增大趋近于1。
4. 一般我们用到的近似方式都是g(N) ~ af(N),其中f(N) = N^b(logN)^c,其中a、b和c均为常数。我们将f(N)称为g(N)的增长数量级。
5. 我们假设每个Java代码块所对应的机器指令所需的执行时间都是固定的。
6. 执行最频繁的指令决定了程序执行的总时间--我们将这些指令称为程序的内循环。许多程序的运行时间都只取决于其中的一小部分指令。
理解近似运行时间的关键!
7. ThreeSum的运行时间的增长数量级是N^3,这与它是由Java实现或是它运行在你的笔记本电脑上/某人的手机上/一台超级计算机上无关。
决定这一点的主要因素使它需要检查输入中任意三个整数的所有可能组合。
你所使用的算法(有时还要算上输入模型)决定了增长的数量级。
将算法和某台计算机上的具体实现分离开来是一个强大的概念,因为这是我们对算法性能的知识可以应用于任何计算机。
8. 我们使用了一个成本模型来评估算法的性质。
这个模型定义了我们所研究的算法中的基本操作。
例如,适用于3-sum问题的成本模型是我们访问数组元素的次数。
成本模型的作用:将抽象的循环次数转化成具体的操作次数,模拟算法的真实成本,评估程序的运行时间。
9. 对于大多数程序,得到其运行时间的数学模型所需的步骤如下:
· 确定输入模型(函数),定义问题的规模(N);
· 识别内循环;
· 根据内循环中的操作确定成本模型;
· 对于给定的输入,判断这些操作的执行频率(关于N的数学公式)。
10.
· 表1.4.5 算法分析中的常见函数
· 表1.4.6 算法分析中常用的近似函数
不求掌握,但求理解。