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)
你同意吗?
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);
}
}