【问题标题】:Confusion on expression of time complexity with geometric series时间复杂度与几何级数表达的混淆
【发布时间】:2020-06-06 20:25:20
【问题描述】:

我有这个代码:

int count = 0;
    for (int i = N; i > 0; i /= 2) {
        for (int j = 0; j < i; j++) {
            count += 1;
        }
    }

它的时间复杂度是 O(n),我已经明白为什么了,但我不明白为什么他们从分析代码:

n(1 + 1/2 + 1/4 + 1/8 + …)

内括号可以看作是log(n),所以它不是n(log(n))? (只考虑表达式,不考虑算法)。

例如,我正在分析埃拉托色尼筛法,我得到了类似的表达式:

n/2 + n/3 + n/5 + n/7 + … = n(1/2 + 1/3 + 1/5 +…)

所以括号里面的内容可以看成是loglogn,加上外面的n,最后就是:nloglogn

两者有什么区别:

n(1 + 1/2 + 1/4 + 1/8 + …)

到这里O(nloglogn)

从这里出发:

n(1/2 + 1/3 + 1/5 +…)

O(n)?

【问题讨论】:

    标签: algorithm time-complexity sieve-of-eratosthenes


    【解决方案1】:

    第一个系列收敛到 2:https://www.wolframalpha.com/input/?i=1+%2B+1%2F2+%2B+1%2F4+%2B+1%2F8+%2B...,因此归结为 O(n)。

    第二个系列更难分析,但可以证明与 log(log(n)) 等价(或至少不如快),因此结果为 O(nlog(logn))。示例证明:https://medium.com/@chenfelix/time-complexity-sieve-of-eratosthenes-fb0184da81dc

    【讨论】:

    • 对不起,第二个链接的尝试同样不可接受。原始链接和您更改为使用sum[1, infty] 1/n 的链接都是infinite,然后取其对数,也就是infinite。真正的证据要微妙得多。
    • @user58697 随时分享任何更好的资源。在这种情况下,这绝对是可以接受的,因为关键是它不是微不足道的,我们在这里的讨论也证明了这一点。另外,至少根据Wikipedia 的说法,两边取对数也是欧拉所做的,所以它肯定已经足够好了。但是,我当然会阅读您可以提供的任何更好的资料,尤其是声称对两个无限边取对数总是不正确的资料。否则 - 祝你早日/晚安:-)
    猜你喜欢
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2016-02-13
    相关资源
    最近更新 更多