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.マルティーニョフェルナンデス

13
loglog(n)が存在することは、どこかにsqrt(n)があることをどのように意味しますか?(@Martinho:なぜあなたは「これを学んだ」と言うのですか?)実際の分析は平方根を含みません!
ShreevatsaR 2010

回答:


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)(和全て OであるNまでの番号)、(N Nログ):参照ハーモニック数。より適切な上限はn(1/2 + 1/3 + 1/5 + 1/7 +…)です。これは、O(n log log n)であるnまでの素数の逆数の合計です。(ここまたはここを参照してください。)

  2. 「次の素数を見つける」ビットは全体的にO(n)であり、償却されます。次の数値を見つけるために、ステップごとではなく、合計でn回だけ進みます。したがって、アルゴリズムのこの部分全体はO(n)のみを使用します。

したがって、これら2つを使用すると、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 2016年

2
@crisron問題は何ですか?「漸近的複雑度」と「償却された複雑度」が同じものの2つの異なる種類であるというわけではありません。償却は、何かをより注意深く数えるための手法にすぎません。これは、たまたま漸近的な複雑さになる場合があります。
ShreevatsaR 2016年

私はかつてそれらを異なるものとして考えていましたが、このすべてのことです。明確にしていただきありがとうございます。
クリスロン2016年

1
@ShreevatsaR n項までの調和級数の合計を計算するのはなぜですか。sqrt(n)項まで計算しないでください。n(loglogsqrt(n))算術演算のシータとして答えを与える?また、ウィキペディアはスペースの複雑さはO(n)であると述べています。いずれにせよn要素の配列が必要なので、それはnのシータではないでしょうか?
a_123 2016年

@ s_123はい√n項まで計算できますが、log(√x)=(1/2)であるため、漸近分析に違いはありません(または実行時間に実際的な違いはありません)。任意のxのログx。したがって、Θ(n log log√n)=Θ(n log log n)です。あなたの他の質問に、はい、空間の複雑さはΘ(n)であり、これもO(n)です:indicate()を示すのではなく、O()を使用して上限を指定していることを示すのが一般的ですこれも下限です(特に、ここにあるように、下限が明らかな場合)。
ShreevatsaR 2016年

7

複雑さにloglogn項が含まれていることから、どこかにsqrt(n)があることがわかります。

Pふるい分けしているときに素数を見つけた場合、現在の位置で数値の取り消しを開始しないことに注意してください+ P。あなたは実際にで数字の取り消しを開始しますP^2P未満のすべての倍数はP^2、以前の素数によって打ち消されます。


10
このステートメント自体は真実ですが、それ自体にメリットがない引用されたステートメントとは関係ありません。とのどちらから始めてpp^2、複雑さは同じです(直接アクセス配列の場合)。SUM (1/p) {p<N} ~ log (log N)理由です。
Will Ness

6
  1. 内部ループはn/iステップを実行します。ここiで、prime =>全体の複雑さはsum(n/i) = n * sum(1/i)です。素数調和級数によれば、sum (1/i)where iis素数は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ログログ(sqrt N)
Will Ness
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.