Chapter 3 · Characterizing Running Times
按CLRS第四版第3章重建O、Ω、Θ与o、ω的形式化定义、量词证明、渐近关系性质,以及取整、模运算、多项式、指数、对数、阶乘、迭代对数和Fibonacci函数。
从“哪条曲线最终会赢”开始
先预测:算法A耗时,算法B耗时。在小输入上B可能更快,但随着增长,二次项最终超过任何固定倍数的线性项。Characterizing Running Times要刻画的正是这种“越过某个阈值以后”的关系,而不是一台机器上的一次计时。
渐近分析保留增长率,隐藏固定机器速度、实现常数和低阶项。它不宣称常数不重要,而是把问题拆成两层:先证明规模怎样增长,再用测量选择同一增长等级中的实现。
3.1 O-notation, Ω-notation, and Θ-notation
上界、下界与紧确界
设和在自然数输入上最终非负。给出最终上界;给出最终下界;同时给出两边。
形式上,存在正常数和阈值,使所有满足相应不等式:
例如。对,有且,所以。常数并不唯一;证明只需给出一组有效见证。
“紧确”不等于“精确公式”
允许常数倍误差。与的比值趋近4,但写并不保留系数4。若需求是预测实际延迟,就必须保留操作成本、缓存行为与测量误差,不能只交一条Θ结论。
一定推出和。反向只有两边同时成立才成立:
一个函数可以拥有松上界。例如为真,却不紧确;通常应报告可证明的最紧常用界,让读者看见真实增长等级。
输入情形与记号方向不是同一件事
“最坏情况”先在长度的实例集合上取最大运行时间,得到函数;随后才能说它属于、或。平均情况与最好情况也各自产生自己的函数,它们同样可以拥有上界和下界。
3.2 Asymptotic notation: formal definitions
集合与量词
严格说,是函数集合,正确写法是。算法文献常写,这里等号是一种约定:右侧代表集合中的某个未命名函数。它不能像普通等式那样随意反向推理。例如由不能推出。
定义最关键的是量词顺序。对于O记号:
常数和必须在“对所有后续”之前固定。若允许每个选择,几乎所有正函数都能通过,定义便失去区分增长率的能力。
有限测试只能找反例,不能证明全称命题。程序可以帮助猜测见证,但最终证明要把所有纳入代数推导。对于,利用和即可一次覆盖全部。
function sampledUpperBound(
f: (n: number) => number,
g: (n: number) => number,
c: number,
n0: number,
) {
for (let n = n0; n <= 10_000; n += 1) {
if (f(n) > c * g(n)) return { ok: false, counterexample: n };
}
return { ok: true, counterexample: null }; // evidence, not a proof
}严格上界与严格下界
小写排除同阶常数倍:表示对每个都存在阈值,使;小写反向表示严格快于。当极限存在且最终为正时,可以用比值理解:
例如,而对任意固定成立。注意比值法是方便工具,不替代定义;极限不存在时,仍应回到最终不等式和上下极限。
渐近关系的代数性质
Θ关系具有自反、对称和传递性,像函数增长等级上的等价关系。O与Ω各自传递,并满足转置对称:当且仅当。这些性质允许把多步界串联,但每步都要保证函数最终非负。
和式通常由较快增长项支配。若最终非负,则:
乘积则相乘各自的界。若项会正负抵消,上述直觉可能失效,因此运行时间分析通常先把成本建模为非负函数。
3.3 Standard notations and common functions
单调性、取整与模运算
算法规模是整数,因此分治常出现和。取整只造成不足1的误差,通常不改变渐近等级,但在递推基例、数组边界和精确证明中不能直接删除。恒等式提供上下夹界。
模运算把整数映射到固定余数集合,,用于环形缓冲区、哈希桶和周期状态。对负数时,不同语言的余数约定可能不同;数学证明与代码必须采用同一语义。
多项式、指数与对数
次数为且首项系数为正的多项式满足。任意固定多项式最终都慢于底数大于1的指数函数,而不同底数的指数函数不只差常数倍。
对数把乘法规模变成加法层数。换底公式表明固定底数只贡献常数:
因此算法分析常把写作二进制对数,而在Θ记号中省略底数。常用恒等式包括、以及。最后一个等式经常用于把递归树的分支数改写为的幂。
阶乘、函数迭代与Fibonacci
阶乘计算排列数量,增长快于任意固定指数但慢于。Stirling近似给出可用于取对数的紧确表达:
函数迭代表示把连续应用次,不是幂。就是达到常数范围所需的迭代次数,在并查集和某些高级算法中出现。即使巨大,仍很小,但它不是常数函数。
Fibonacci数满足。特征根公式显示按黄金比例指数增长,因此Fibonacci堆或递归算法中的“阶数为对数”结论,往往来自节点规模至少按Fibonacci数增长。
growth ladder for fixed k and c > 1:
1 ≺ lg* n ≺ lg lg n ≺ lg n ≺ n^k ≺ c^n ≺ n! ≺ n^n这条阶梯要求参数固定。若或随变化,比较关系必须重新证明;“指数一定比多项式快”隐含指数底数固定大于1、多项式次数固定。
小结
Chapter 3 Characterizing Running Times把“增长得更快”变成可证明命题。O记号给最终上界,Ω记号给最终下界,Θ记号要求两边同时成立;o与ω表达严格的低阶和高阶关系。它们都是函数集合,定义依赖固定正常数、阈值和覆盖无限后缀的量词顺序。
标准记号与常用函数提供化简词汇:取整处理离散规模,模运算处理周期,多项式由最高次数支配,固定底对数只差常数,指数最终超过固定次数多项式,Stirling公式刻画阶乘,迭代对数和Fibonacci则连接后续数据结构分析。一个完整结果必须同时说明分析对象、界的方向、见证与使用的函数恒等式。