算法的效率

时间:2013-09-10 14:19:36

标签: algorithm

我很难理解算法的效率,你如何确定那个特定的句子或部分是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
}

这一切让我感到疑惑,你怎么知道什么是成本是什么?我一直在四处询问,试图理解,但实际上没有人可以向我解释这一点。我真的很想知道如何才能真正确定成本。有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:5)

大O符号并不是衡量程序运行的时间。它表示随着问题规模的扩大,运行时间会增加多快。

例如,如果计算的东西是O(1),那可能是很长的时间,但它与问题的大小无关。

答案 1 :(得分:2)

通常情况下,您不期望估计循环迭代器等事情的成本(假设存储一个整数值并将其更改N次太小而不能包括在结果估算中)。

真正重要的是 - 根据Big-O,Big-Theta e.t.c,你应该找到功能依赖,即找到一个参数(N)的函数,其中:

  • Big-O:整个算法运算次数小于F(N)
  • Big-Theta:整个算法运算次数增长等于F(N)
  • Big-Omega:整个算法运算次数增长大于F(N)

所以,记住 - 你不是想找到数字的操作,你正在尝试找到功能估计,即功能依赖在传入数据量NN之间的某些功能之间,表示操作计数的增长速度。

因此,例如,O(1)表示整个算法不依赖来自N(它是常数)。您可以阅读更多here

此外,还有不同类型的估算。例如,您可以估计内存或执行时间 - 在常见情况下这将是不同的估计。