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. 전체 시간 복잡성이 다음 n과 sqrt(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.