Sieve of Eratosthenes 알고리즘의 시간 복잡성


95

에서 위키 백과 :

알고리즘의 복잡성은 O(n(logn)(loglogn))비트 연산입니다.

그것에 어떻게 도달합니까?

복잡성에 loglogn용어가 포함되어 있다는 것은 sqrt(n)어딘가에 있음을 알려줍니다 .


처음 100 개의 숫자 ( n = 100) 에 대해 체를 실행한다고 가정 하고 숫자를 합성으로 표시하는 데 일정한 시간이 걸린다고 가정하면 (배열 구현), 사용하는 횟수는 mark_composite()다음과 같을 것입니다.

n/2 + n/3 + n/5 + n/7 + ... + n/97        =      O(n^2)                         

그리고 다음 소수를 찾으려면 (예 :의 7배수 인 모든 숫자를 건너 뛰고 건너 뛰기 위해 5) 연산 수는입니다 O(n).

따라서 복잡성은 O(n^3). 동의하십니까?


5
나는 나머지에 대해 알지 못합니다 (지금 너무 졸린 뇌에 대해서는 너무 수학적).하지만 제곱근은 숫자가 제곱근보다 작은 제수가 없으면 소수라는 사실에서 비롯됩니다. 또한 loglog (n)은 제곱근이 있음을 방금 배웠습니다. 좋은.
R. Martinho Fernandes

13
loglog (n)이 어딘가에 sqrt (n)이 있다는 것을 어떻게 의미합니까? (@Martinho : 왜 "방금 배웠다"고 말합니까?) 실제 분석은 제곱근을 포함하지 않습니다!
ShreevatsaR

답변:


117
  1. n / 2 + n / 3 + n / 5 +… n / 97은 항의 수가 일정하지 않기 때문에 O (n)이 아닙니다. [편집 후 편집 : O (n 2 )는 상한선이 너무 느슨합니다.] 느슨한 상한선은 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 log n)입니다. ( 여기 또는 여기를 참조 하십시오 .)

  2. "다음 소수 찾기"비트는 전체적으로 O (n)에 불과하며 상각 됩니다 . 단계 당이 아니라 n 번만 다음 숫자를 찾습니다 . 따라서 알고리즘의 전체 부분은 O (n) 만 사용합니다.

따라서이 두 가지를 사용하면 O (n log log n) + O (n) = O (n log log n) 산술 연산의 상한을 얻습니다. 비트 연산을 계산하면 n까지의 숫자를 다루기 때문에 약 log n 비트를 가지며, 여기서 log n의 인수가 들어와 O (n log n log log n) 비트 연산을 제공합니다.


문제의 한 부분에 대해 점근 적 복잡성을 고려하고 있습니다. 다른 부분에 대해서는 상각 된 공평성을 고려하고 있습니다. 혼란 스럽습니다.
crisron

2
@crisron 문제가 무엇입니까? "점근 적 복잡성"과 "상각 된 복잡성"이 동일한 두 가지 다른 종류 인 것은 아닙니다. 상각은 점근 적 복잡성이 될 수있는 무언가를 더 신중하게 계산하는 기술 일뿐입니다.
ShreevatsaR

이 모든 것들이 다른 것으로 생각하는 동안. 명확히 해주셔서 감사합니다.
crisron

1
@ShreevatsaR n 항까지 고조파 시리즈의 합을 계산하는 이유는 무엇입니까? sqrt (n) 항까지만 계산해야하지 않습니까? n (loglogsqrt (n)) 산술 연산의 세타로 답을 제공합니까? 또한 wikipedia는 공간 복잡성이 O (n)이라고 말합니다. 어떤 경우에도 n 요소의 배열이 필요하기 때문에 n의 세타가 아니어야합니까?
a_123

@ s_123 예, 최대 √n 항까지 계산할 수 있지만 log (√x) = (1/2)이기 때문에 점근 분석 (또는 실행 시간의 실질적인 차이)에 차이가 없습니다. x에 대해 log x. 따라서 Θ (n log log √n) = Θ (n log log n)입니다. 다른 질문에, 예, 공간 복잡성은 Θ (n)이고, 또한 O (n)입니다. 표시하기 위해 Θ ()라고 말하는 대신 O ()를 사용하여 상한을 지정하고 있음을 나타내는 것이 일반적입니다. (특히 여기에있는 것처럼 하한이 명백 할 때) 하한이기도합니다.
ShreevatsaR

7

복잡성에 loglogn 용어가 포함되어 있다는 것은 sqrt (n) 어딘가에 있음을 알려줍니다.

P체질하는 동안 소수를 찾으면 현재 위치에서 숫자를 교차 시키기 시작하지 않습니다 P. + ; 실제로에서 숫자를 교차하기 시작 P^2합니다. P보다 작은 모든 배수는 P^2이전 소수에 의해 교차됩니다.


10
이 진술은 그 자체로 사실이지만, 그 자체로는 장점이없는 인용 된 진술과는 관련이 없습니다. 우리가에서 시작하든 p또는 p^2, 복잡성 (직접 액세스 배열) 동일합니다. SUM (1/p) {p<N} ~ log (log N)이유입니다.
Will Ness

6
  1. 내부 루프는 n/i단계를 수행합니다. 여기서 i프라임 => 전체 복잡성은 sum(n/i) = n * sum(1/i). 주요 고조파 시리즈에 따르면, sum (1/i)여기서 i소수입니다 log (log n). 총 O(n*log(log n)).
  2. 전체 시간 복잡성이 다음 nsqrt(n)같이 대체하여 상위 루프를 최적화 할 수 있다고 생각합니다 O(sqrt(n)loglog(n)).

    void isprime(int n)
    {
        int prime[n],i,j,count1=0;
        for(i=0;i<n;i++)
        {
           prime[i]=1;
        }
        prime[0]=prime[1]=0;
        for(i=2;i<=n;i++)
        {
            if(prime[i]==1)
            {
                printf("%d ",i);
                for(j=2;(i*j)<=n;j++)
                    prime[i*j]=0;
            }
        }    
    }
    

2
아니요, n을 sqrt (n)으로 바꾸면 ~ n log log (sqrt n)가됩니다. 이는 여전히 ~ n log log n입니다. 그리고 isprime거기에서 사용하기에 절대적으로 잘못된 이름입니다.
Will Ness

-1

위의 설명을 참조하십시오. 내부 루프는 sqrt (n)까지 모든 소수의 고조파 합계입니다. 따라서의 실제 복잡성은 O (sqrt (n) * log (log (sqrt (n))))입니다.


2
잘못된. 우리는 N까지 표시합니다 : N / 2 + N / 3 + N / 5 + N / 7 + N / 11 + ... = N (1/2 + 1/3 + 1/5 + 1/7 + 1/11 + ...) ~ (~ N 로그 로그 N.) N SQRT N 로그 로그
윌 네스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.