繁体   English   中英

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

[英]Big O - O(log(n)) code example

像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问题”有什么解决方案(当获取大量数据作为输入时该怎么办)?

经典示例:

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)

根据定义,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))。

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

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

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

O(1):

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

上):

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(平方(n)):

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

在此处输入图片说明

可能需要强调的是,您描述的较低复杂度算法是较高复杂度算法的子集。 换一种说法,

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

在O(1)中,也在O(n),O(n²)中,并且,如果您想变得聪明一点,也可以在O(log(n))中。为什么? 因为所有恒定时间算法都受某些线性,二次函数等限制。

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

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

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

让我们给出将标签x的n除以2所需的次数。 由于除以2,x倍等于除以2 ^ x,因此最终必须解决以下方程:

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

因此,使用对数,x = log(n),因此二元搜索的BIG-O为O(log(n))

重申一下:x是在将大小为n的空间缩小为大小1之前可以将其分成两半的次数。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM