Algorithm Eratosthenes算法筛的时间复杂度

Algorithm Eratosthenes算法筛的时间复杂度,algorithm,performance,time-complexity,sieve-of-eratosthenes,Algorithm,Performance,Time Complexity,Sieve Of Eratosthenes,从 算法的复杂度是 O(n(logn)(loglogn))位操作 你是如何做到这一点的? 复杂性包括loglogn术语,这告诉我在某个地方有一个sqrt(n) 假设我在前100个数字上运行筛选(n=100),假设将数字标记为复合数字需要恒定的时间(数组实现),我们使用mark\u composite()的次数如下 n/2 + n/3 + n/5 + n/7 + ... + n/97 = O(n^2) 为了找到下一个素数

算法的复杂度是
O(n(logn)(loglogn))
位操作

你是如何做到这一点的?

复杂性包括
loglogn
术语,这告诉我在某个地方有一个
sqrt(n)


假设我在前100个数字上运行筛选(
n=100
),假设将数字标记为复合数字需要恒定的时间(数组实现),我们使用
mark\u composite()
的次数如下

n/2 + n/3 + n/5 + n/7 + ... + n/97        =      O(n^2)                         
为了找到下一个素数(例如,在划掉所有是
5
倍数的数之后跳到
7
),操作的次数将是
O(n)

因此,复杂性将是
O(n^3)
你同意吗?

  • 你的n/2+n/3+n/5+…n/97不是O(n),因为项数不是常数。[编辑后编辑:O(n2)的上限太过宽松。]宽松的上限是n(1+1/2+1/3+1/4+1/5+1/6+…1/n)(所有数字的倒数之和,最多n),即O(n log n):请参阅。一个更合适的上界是n(1/2+1/3+1/5+1/7+…),即素数的倒数之和到n,即O(n log n)。(见或。)

  • “查找下一个素数”位整体上仅为O(n)-您将在总计中向前移动仅查找下一个数n次,而不是每一步。所以整个算法只需要O(n)

  • 使用这两个函数,可以得到O(n logn)+O(n)=O(n logn)算术运算的上界。如果你计算位运算,因为你处理的是n以下的数字,它们大约有logn位,这就是logn的因子,给出O(n logn logn logn)位运算

    复杂性包括logn项,这告诉我某处有一个sqrt(n)

    请记住,当你在筛选时发现一个素数
    p
    ,你不会在你当前的位置开始划掉这个数+
    p
    ;实际上,您开始在
    P^2
    处划掉数字。小于
    P^2
    P
    的所有倍数将被先前的素数划掉

  • 内部循环执行
    n/i
    步骤,其中
    i
    是prime=>整个循环 复杂性是
    sum(n/i)=n*sum(1/i)
    。根据本原谐波 序列中,
    sum(1/i)
    其中
    i
    为素数的是
    log(logn)
    。在里面 总计,
    O(n*log(log n))
  • 我认为可以通过将
    n
    替换为
    sqrt(n)
    来优化上层循环,因此总体时间复杂度将
    O(sqrt(n)loglog(n))
  • void isPrime(int n){
    整数素数[n],i,j,count1=0;
    对于(i=0;i对于(i=2;i参见上面的解释,内环是所有素数到sqrt(n)的调和和。因此,的实际复杂度是O(sqrt(n)*log(log(sqrt(n)))

    int n=100;
    int[]arr=新int[n+1];
    对于(int i=2;i Tk=n/sqrt(k)


    当k=sqrt(n)=>n[1/sqrt(2)+1/sqrt(3)+……]=n*log(log(n))=>O(nloglogn)

    我不知道其余的(对于我现在太困的大脑来说太数学了),循环停止,但平方根源于这样一个事实:如果一个数字的除数小于其平方根,那么它就是素数。而且,我刚刚了解到loglog(n)意思是有一个平方根。很好。loglog(n)在那里怎么意味着某处有一个sqrt(n)?(@Martinho:你为什么说你“刚刚学会了这个”?)实际分析不涉及任何平方根!该语句本身是正确的,但与引用的语句无关,该语句本身没有任何价值。无论我们从
    p
    还是
    p^2
    开始,复杂性都是相同的(使用直接访问数组)。
    SUM(1/p){p问题的一部分,你考虑的是渐近复杂性。另一部分,你考虑的是摊销复杂性。我很困惑。@crisron问题是什么?不是“渐近复杂性”和“摊销复杂性”是同一事物的两种不同类型。摊销只是一种更仔细地计算某物的技术,它可能恰好是渐近复杂性。所有这些我都认为它们是不同的。谢谢你的澄清。@ShreevatsaR为什么我们要计算谐波级数之和达n项。我们不应该只计算达n项吗sqrt(n)项?以n(logsqrt(n))算术运算的θ给出答案?此外,维基百科说空间复杂度是O(n)。那不应该是n的θ吗,因为我们在任何情况下都需要n个元素的数组?@s_123是的,你可以计算到√n项,但它不会在渐近分析中产生差异(甚至在运行时间上也不会产生显著的实际差异),因为(√x) =(1/2)对于任何x.SoΘ(n log log√n) =Θ(n log n)。对于你的另一个问题,是的,空间复杂度是Θ(n),也就是O(n):通常使用O()来表示你指定的是上界,而不是说Θ()来表示它也是下界(特别是当下界很明显时,这里就是这样).错。我们一直标记到N:N/2+N/3+N/5+N/7+N/11+…=N(1/2+1/3+1/5+1/7+1/11+…)~N log log(sqrt N)~N log log N.no,用sqrt(N)替换N会使其~N log log(sqrt N)仍然是~N log log N.,
    isprime
    绝对是错误的名称。
    int n = 100;
    int[] arr = new int[n+1];  
    for(int i=2;i<Math.sqrt(n)+1;i++) {
      if(arr[i] == 0) {
        int maxJ = (n/i) + 1;
        for(int j=2;j<maxJ;j++)
        {
          arr[i*j]= 1;
        }
      }
    }
    for(int i=2;i<=n;i++) {
      if(arr[i]==0) {
        System.out.println(i);
      }
    }