算法和数据结构
算法
函数的增长
渐近记号
用来描述算法渐近运行时间的记号,根据定义域为自然数集 N={ 0,1,2,⋯} 的函数来定义。这样的记号对描述最坏情况运行时间函数 T(n) 是方便的,因为该函数通常只定义在整数输入规模上。
Θ 记号
对一个给定的函数 g(n) ,用 Θ(g(n)) 来表示一下函数的集合:
Θ(g(n))={ f(n):存在正常量c1、c2和c0,使得对所有n≥n0,有0≤c1g(n)≤f(n)≤c2g(n)}
若存在正常量 c1 和 c2 使得对足够大的 n ,函数
我们称 g(n) 是 f(n) 的一个渐进紧确界(asymptotically tight bound)。
一般来说,对任意多项式 p(n)=∑ni=1aini ,其中 ai 为常量且 ad>0 ,我们有 p(n)=Θ(nd) 。
因为任意常量是一个0阶多项式,所以可以把任意常量函数表示成 Θ(n0) 或者 Θ(1) 。
O 记号
Θ 记号渐近地给出一个函数的上界和下界。当只有一个渐进上界时,使用 O 记号。对于给定的函数g(n) ,用 O(g(n)) 来表示以下函数的集合:
O(g(n))={ f(n):存在常量c和n0,使得对所有n≥n0时,有0≤f(n)≤cg(n)}Ω 记号
正如 O 记号提供了一个函数的渐近上界,
Ω 记号提供了渐近下界。对于给定的函数 g(n) ,用 Ω(g(n)) 来表示以下函数的集合:
Ω(g(n))={ f(n):存在正常量c和n0,使得对所有n≥n0时,有0≤cg(n)≤f(n)}定理3.1:对任意两个函数 f(n) 和 g(n) ,我们有 f(n)=Θg(n) ,当且仅当: f(n)=Og(n) 且 f(n)=Ωg(n) 。
o 记号
由
O 记号提供的渐近上界可能是也可能不是渐近紧确的。界 2n2=Og(n2) 是渐近紧确的,但是界 2n=Og(n2) 却不是。我们使用 o 记号来表示一个非渐进紧确的上界。形式地定义
o(g(n)) 为以下集合:o(g(n))={ f(n):对任意正常量c>0,存在常量n0>0,使得对所有n>n0,有0≤f(n)<cg(n)}O 记号与
o 记号的定义类似。主要区别在于是 f(n)=O(g(n)) 中,界 0≤f(n)≤cg(n) 对某个常量 c>0 成立,但在 f(n)=o(g(n)) 中,界 0≤f(n)<cg(n) 对所有常量 c>0 都成立。直观上,在 o 记号中,当n 趋于无穷时,函数 f(n) 相对于 g(n) 来说变得微不足道了,即:
limn→∞f(n)g(n)=0ω 记号
ω 记号与 Ω 记号的关系类似于 o 与
O 的关系。我们使用 ω 来定义一个非渐近紧确的下界。定义它的一种方式是:
f(n)∈ωg(n) 当且仅当 g(n)∈o(f(n))
然而我们形式化地定义 f(n)=ω(g(n)) 为以下集合:
ω(g(n))={ f(n):对任意正常量c>0,存在常量n0>0,使得对所有的n≥n0时,有0≤cg(n)<f