【计算理论】时间复杂性
概述
参考《计算理论导引》(Michael Sipser,第三版)第七章。
本文考虑如何度量时间复杂性,并且定义了一些方便起见的概念以便使用。
本文作为参考书阅读笔记,需要你至少能阅读前六章的内容。
复杂性的记法
- \(M\)是对所有输入停机的确定型图灵机。
- \(f(n)\)是在所有长度为\(n\)的输入上\(M\)运行的最大步数。
- 则称\(M\)在时间\(f(n)\)内运行,\(M\)是\(f(n)\)时间图灵机。
上面这种记法讨论了算法的最坏情况分析(worst-case analysis),还有讨论运行平均步数的平均情况分析(average-case analysis)。
由于精确的运行时间讨论起来相当复杂,同时不具有普遍性,因此只需要估计其趋势和级别即可。
为此,只需要考虑算法运行时间的最高次项(随着n的增长增长最快的项)即可,这种方法被称为渐进分析(asymptolic analysis)。
给出形式化的定义:
\(f,\ g:\mathbb{N}\to\mathbb{R}^+\),如果存在正整数\(c,\ n_0\),使得所有\(n\geqslant n_0\):
\[f(n) \leqslant cg(n) \]称\(g(n)\)是\(f(n)\)的渐进上界,记作\(f(n)=O(g(n))\)。
当\(g(n)\)是一个多项式时,我们称这个界是一个多项式界(polunomial bound);是一个指数函数时称其是指数界(exponential bound)
另外,还有一种更严格的记法:
\(f,\ g:\mathbb{N}\to\mathbb{R}^+\),如果存在正整数\(c,\ n_0\),使得所有\(n\geqslant n_0\):
\[f(n) < cg(n) \]记作\(f(n)=o(g(n))\)。
语言的复杂性
使用时间复杂性可以给语言分类:
令\(t:\mathbb{N}\to\mathbb{R}^+\)是一个函数,定义时间复杂性类(time complexity class)TIME(\(t(n)\)) 为由\(O(t(n))\)时间的图灵机判定的所有语言的集合。