如何确定哪个快 Big Oh Notation
How to determine which one is fast Big Oh Notation
我正在研究下面的一个给定问题,并试图在比较 A 和 B 步骤的图表中给出我的答案,但是还有其他方法吗?
假设对于一个大小为 n 的问题,算法 A 需要 1000n^3 步,算法 B 需要 2^n 步(注意胡萝卜符号 ^ 表示乘方)。对于什么规模的问题,算法 A 比 B 快(意味着算法 A 的步骤比 B 少)?
答案是24,你可以像下面这样写一个程序来找到它
public static void main(String[] args) {
for (int i=1; i<100; i++){
double b = pow(2, i);
double a = 1000 * pow(i, 3);
if (b> a){
System.out.println(" i is " + i + " as a result a is " + a + " and b is " + b);
break;
}
}
这是输出:
i 是 24 结果 a 是 1.3824E7 和 b 是 1.6777216E7
如果您尝试使用 O 表示法:
1000*n^3 = O(n^3)
, 2^n = O(2^n)
, 所以理论上 O(n^3) 远小于 (2^n).
但是如果你想用精确的表达式,那么它就变成了一个纯数学问题:任何可以绘制函数的数学软件都可以告诉你什么时候函数更大,哪个函数更大。
我们使用 O 表示法的原因是为了忽略常量。这并不是因为大的隐藏常量真的可以忽略,而是因为常量的估计通常不准确——这在很大程度上取决于您的硬件和程序的细节。
我正在研究下面的一个给定问题,并试图在比较 A 和 B 步骤的图表中给出我的答案,但是还有其他方法吗? 假设对于一个大小为 n 的问题,算法 A 需要 1000n^3 步,算法 B 需要 2^n 步(注意胡萝卜符号 ^ 表示乘方)。对于什么规模的问题,算法 A 比 B 快(意味着算法 A 的步骤比 B 少)?
答案是24,你可以像下面这样写一个程序来找到它
public static void main(String[] args) {
for (int i=1; i<100; i++){
double b = pow(2, i);
double a = 1000 * pow(i, 3);
if (b> a){
System.out.println(" i is " + i + " as a result a is " + a + " and b is " + b);
break;
}
}
这是输出: i 是 24 结果 a 是 1.3824E7 和 b 是 1.6777216E7
如果您尝试使用 O 表示法:
1000*n^3 = O(n^3)
, 2^n = O(2^n)
, 所以理论上 O(n^3) 远小于 (2^n).
但是如果你想用精确的表达式,那么它就变成了一个纯数学问题:任何可以绘制函数的数学软件都可以告诉你什么时候函数更大,哪个函数更大。
我们使用 O 表示法的原因是为了忽略常量。这并不是因为大的隐藏常量真的可以忽略,而是因为常量的估计通常不准确——这在很大程度上取决于您的硬件和程序的细节。