我很难理解算法的效率,你如何确定那个特定的句子或部分是lg n,O(N)还是log base 2(n)?
我在这里有两个例子。
doIt()可以表示为O(n)= n ^ 2.
第一个例子。
i=1
loop (i<n)
doIt(…)
i=i × 2
end loop
以上费用如下:
i=1 ... 1
loop (i<n) ... lg n
doIt(…) ... n^2 lg n
i=i × 2 ... lg n
end loop
第二个例子:
static int myMethod(int n){
int i = 1;
for(int i = 1; i <= n; i = i * 2)
doIt();
return 1;
}
以上费用如下:
static int myMethod(int n){ ... 1
int i = 1; ... 1
for(int i = 1; i <= n; i = i * 2) ... log base 2 (n)
doIt(); ... log base 2 (n) * n^2
return 1; ... 1
}
这一切让我感到疑惑,你怎么知道什么是成本是什么?我一直在四处询问,试图理解,但实际上没有人可以向我解释这一点。我真的很想知道如何才能真正确定成本。有人可以帮我这个吗?
答案 0 :(得分:5)
大O符号并不是衡量程序运行的时间。它表示随着问题规模的扩大,运行时间会增加多快。
例如,如果计算的东西是O(1),那可能是很长的时间,但它与问题的大小无关。
答案 1 :(得分:2)
通常情况下,您不期望估计循环迭代器等事情的成本(假设存储一个整数值并将其更改N
次太小而不能包括在结果估算中)。
真正重要的是 - 根据Big-O,Big-Theta e.t.c,你应该找到功能依赖,即找到一个参数(N)的函数,其中:
所以,记住 - 你不是想找到数字的操作,你正在尝试找到功能估计,即功能依赖在传入数据量N
与N
之间的某些功能之间,表示操作计数的增长速度。
因此,例如,O(1)表示整个算法不依赖来自N
(它是常数)。您可以阅读更多here。
此外,还有不同类型的估算。例如,您可以估计内存或执行时间 - 在常见情况下这将是不同的估计。