Big O - O(log(n))代码示例

时间:2013-06-15 10:48:10

标签: java algorithm big-o

与Big O符号一样,“O(1)”可以描述以下代码:

O(1):

    for (int i = 0; i < 10; i++) {
        // do stuff 
        a[i] = INT;
    }

O(n):

    for (int i = 0; i < n; i++) {
        // do stuff 
        a[i] = INT;
    }

O(n^2):
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // do stuff
            a[i][j] = INT;
        }
    }
  • O(log(n))可以描述哪些代码?

另一个问题:

  • “大O问题”有什么解决方案(当将大量数据作为输入时该怎么办?)

7 个答案:

答案 0 :(得分:37)

经典示例:

while (x > 0) {  
   x/=2;  
}  

这将是:

Iteration |   x
----------|--------
    0     |   x
    1     |  x/2
    2     |  x/4
   ...    |  ...
   ...    |  ...
    k     |  x/2^k 

2 k = x→将记录应用于双方→k = log(x)

答案 1 :(得分:3)

对于O(logn),请查看涉及分而治之策略的任何代码 示例:合并排序&amp;快速排序(在这些情况下,预期运行时间为O(nlogn))

答案 2 :(得分:3)

从定义来看,log(n)(我的意思是这里用基数2登录,但基数无关紧要),是你必须自己乘以2得到n的次数。所以,O(log(n))代码示例是:

i = 1
while(i < n)
    i = i * 2
    // maybe doing addition O(1) code

在实际代码示例中,您可以在二分搜索,平衡二叉搜索树,许多可靠算法,优先级队列中满足O(log(n))。

答案 3 :(得分:1)

二进制搜索是一个例子OF(log(n))。 http://en.wikipedia.org/wiki/Binary_search_algorithm

答案 4 :(得分:1)

带有for循环的最简单的代码,您可以用来表示:

O(1):

function O_1(i) {
    // console.log(i);
    return 1
}

O(n)

function O_N(n) {
    count = 0;
    for (i = 0; i < n; i++) {
        // console.log(i);
        count++;
    }
    return count
}

O(n²):

function O_N2(n) {
    count = 0;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            // console.log(i, j);
            count++;
        }
    }
    return count
}

O(Log_2(n)):

function O_LOG_2(n) {
    count = 0;
    for (var i = 1; i < n; i = i * 2) {

        count++;
    }
    return count
}

O(Sqrt(n)):

function O_SQRT(n) {
    count = 0;
    for (var i = 1; i * i < n; i++) {
        // console.log(i);
        count++;
    }
    return count
}

enter image description here

答案 5 :(得分:0)

值得强调的是,您描述的较低复杂度算法是较高复杂度算法的子集。换句话说,

for (int i = 0; i < 10; i++) {
    // do stuff 
    a[i] = INT;
}

在O(1)中,但在O(n),O(n²)中,如果你想要聪明,O(log(n))。为什么?因为所有常数时间算法都受到一些线性,二次等函数的限制。

  

“大O问题”有什么解决方案(当将大量数据作为输入时该怎么做?)

这个问题对我来说没有多大意义。 “很多数据”是相当武断的。不过,请记住,大O并不是时间复杂度的唯一衡量标准;除了测量最坏情况时间复杂度之外,我们还可以检查最佳情况和平均情况,尽管这些可能有点难以计算。

答案 6 :(得分:0)

在二进制搜索的情况下,您试图找到最大迭代次数,因此搜索空间可以分成两半的最大次数。这是通过将搜索空间的大小n重复除以2来实现的,直到达到1。

让我们给出你需要将n除以标签x的次数。除以2,x倍相当于除以2 ^ x,你最终必须求解这个等式:

n / 2 ^ x = 1,变为n = 2 ^ x,

所以使用对数,x = log(n),所以二元搜索的BIG - O是O(log(n))

重申:x是在将范围缩小到1之前将大小为n的空间分成两半的次数。

http://www.quora.com/How-would-you-explain-O-log-n-in-algorithms-to-1st-year-undergrad-student