2.1 数学基础
本书将使用以下四个定义:
定义:如果存在正常数 和
使得当
时
,则记为
定义:如果存在正常数 和
使得当
时
,则记为
定义:当且仅当且
时,
定义:如果且
,则
第一个定义的意思是,总存在某个点使得在这个点或这点之后的
会让
至少和
一样大。忽略常数因子的话就是
至少和
一样大。再说简单点就是用传统的不等式来计算增长率,第一个定义是说,
增长率小于等于
,第二个是
大于等于
,第三个是
等于
,第四个是
小于
需要掌握的重要结论为:
法则1:如果,且
那么
(a)
(b)
法则2:如果是一个k次多项式,则
法则3:对任意常数,
。它告诉我们对数增长非常缓慢
2.2 模型 - 略
2.3 要分析的问题
要分析的最重要的资源是运行时间,我们只考虑使用的算法以及该算法的输入的因素。
通常输入的大小是主要的考虑方面,我们定义两个函数,分别是输入为N时算法花费的平均运行时间和最坏运行时间,显然
。一般若无其他指定,则需要的是最坏情况下的运行时间,一个原因是它对所有的输入提供了一个界限,另一个原因是平均情况的界计算起来要困难得多。
我们将在下一节考虑下述问题:
最大子序列问题
给定整数(可能有负数),求
的最大值(为方便起见,若所有整数为负数,则最大子序列和为0)
例如:输入-2,11,-4,13,-5,-2时,答案为20(从到
),这个问题之所以有吸引力,主要是因为有许多求解它的算法,而这些算法性能相差很大。如图有四种算法
算法 | 1 | 2 | 3 | 4 |
时间 | ||||
N=10 | 0.00103 | 0.00045 | 0.00066 | 0.00034 |
N=100 | 0.47015 | 0.01112 | 0.00486 | 0.00063 |
N=1000 | 448.77 | 1.1233 | 0.05843 | 0.00333 |
N=10000 | NA | 111.13 | 0.68631 | 0.03042 |
N=100000 | NA | NA | 8.0113 | 0.29832 |
对于算法4,从磁盘读入数据所用的时间很可能在数量级上比求解上述问题需要的时间还要多,这是许多有效算法的典型特点。
2.4 运行时间计算 - 略
太累了不想写了,这两篇文章就当作记录吧