一些关于渐进时间复杂度的疑问
查看原帖
一些关于渐进时间复杂度的疑问
1033727
toolazy楼主2024/8/17 13:39

懵懂无知的我在学过之后冒出了许多的疑问

第一个问题:

  1. 我们都知道,调和级数的渐进是 O(lg⁡n)O(\lg n) 的,证明方法很多也很初等。

    那么怎么证明素调和的渐进是 O(lg⁡lg⁡n)O(\lg\lg n) 的?我找不到初等的证明,太菜了看不懂 qwq,求大佬给一个简单的证明方法。

  2. 根据素调和渐进为 O(lg⁡lg⁡n)O(\lg\lg n) 这个命题,容易得出埃氏筛(特指下方的非标准代码)的时间复杂度为 O(nlg⁡lg⁡n)O(n\lg\lg n):

    for (int i = 1; i <= n; i ++) {
      if (notprime[i]) continue;
      primes.push_back(i);
      for (int j = i + i; j <= n; j += i)
        notprime[j] = true;
    }
    

    但这与网上的普遍表述不统一,大部分材料都称上代码的时间复杂度为 O(nlg⁡n)O(n\lg n) 的。

    根据素调和渐进,上述代码的时间复杂度就应该是 O(nlg⁡lg⁡n)O(n\lg\lg n) 的,下面,我们认为该命题正确。

    那么,这样子就可以引申出一个更深的问题。首先参见下面的标准埃氏筛代码:

    for(int i = 1; i <= n; i ++) {
      if (notprime[i]) continue;
      primes.push_back(i);
      for (int j = i * i; j <= n; j += i)
        notprime[j] = true;
    }
    

    对于这份代码,大家的观点都是统一的 O(nlg⁡lg⁡n)O(n\lg\lg n),母庸置疑。

    那么,注意到对于每一个 i∈Pi\in\mathbb{P},标准代码都比错误代码少筛了 ii 次,总和也就是素数和。

    那么,如果时间复杂度都相同,这能否说明,素数和的渐进就是 O(nlg⁡lg⁡n)O(n\lg\lg n) 呢?

    关于这个命题,我在网上没有找到相关证明,求大佬解惑。

2024/8/17 13:39
加载中...