? 符号
theta 符号
在这我们用?(g(n)) 来表示一组函数:?(g(n)) = {f(n): 任何大于0的常数 c1, c2, 和 n0 满足 0<=c1g(n)<=f(n)<=c2g(n),对于所有的 n>=n0}.
我们说g(n) 是f(n) 的渐近紧范围 (asymptotically tight bound)。
因为?(g(n)) 的定义要求每个符合?(g(n)) 要求的f(n) 得是渐近不是负数的 (asymptotically non-negative),也就是说,无论n 有多大,f(n) 都不会是负数。
函数g(n) 本身必须是渐近不是负数 (asymptotically non-negative) 或则集合?(g(n)) 是空集。
O 符号 大写
O 大写符号
在这我们用O(g(n)) 来表示一组函数:
O(g(n)) = {f(n): 任何大于0的常数 c 和 n0 满足 0<=f(n)<=cg(n),对于所有的 n>=n0}.
我们说g(n) 是f(n) 的渐近上范围 (asymptotically upper bound)。
注意:f(n)=?(g(n)) 说明了f(n)=O(g(n)) ,因为? 符号是个比O 符号强的符号;所以,我们可以说?(g(n)) ? O(g(n)),?(g(n))是O(g(n)) 的子集。
Ω 符号 大写
omega 大写符号
在这我们用Ω(g(n)) 来表示一组函数:
Ω(g(n)) = {f(n): 任何大于0的常数 c 和 n0 满足 0<=cg(n)<=f(n),对于所有的 n>=n0}.
我们说g(n) 是f(n) 的渐近下范围 (asymptotically lower bound)。
这里说个理论,如果对任何两个函数f(n) 和 g(n),仅且仅只有当f(n)=O(g(n)) 和f(n)=Ω(g(n)),我们会有?(g(n))。
o 符号 小写
o 小写符号
在这我们用o(g(n)) 来表示一组函数:
o(g(n)) = {f(n): 任何大于0的常数 c,存在大于0的 n0 满足 0<=f(n)<cg(n),对于所有的 n>=n0}.
我们说g(n) 是f(n) 的上范围但不是渐近紧 (upper bound that is not asymptotically tight)。
而且,在o 符号中,当n 越来越接近无穷大,函数f(n) 和g(n) 的关系会变得越来越无关紧要;也就是说,lim x → ∞ (f(n)/g(n)) = 0.
ω 符号 小写
omega 小写符号
在这我们用ω(g(n)) 来表示一组函数:
ω(g(n)) = {f(n): 任何大于0的常数 c,存在大于0的 n0 满足 0<=cg(n)<f(n),对于所有的 n>=n0}.
我们说g(n) 是f(n) 的下范围但不是渐近紧 (lower bound that is not asymptotically tight)。
而且,在o 符号中,当n 越来越接近无穷大,函数f(n) 和g(n) 的关系会变得越来越重要;也就是说,lim x → ∞ (f(n)/g(n)) = ∞.
测试算法时间的程序
下面这段伪代码是以纳秒为单位计算的,可以在实际中相对准确地验证我们的理论时间。
// Java代码,测试程序运行的时间
// 伪代码
long startTime=System.nanoTime(); // 获取开始的时间
doSth(); // 算法内容
long endTime=System.nanoTime(); // 获取结束的时间
System.out.println("Running time of algorithm: " + (end-start) + "ns");
|