Eratosthenes Elek algoritmasının zaman karmaşıklığı


96

Gönderen Vikipedi:

Algoritmanın karmaşıklığı O(n(logn)(loglogn))bit işlemlerdir.

Buna nasıl ulaşırsınız?

Karmaşıklığın bu loglognterimi içermesi bana bir yer olduğunu söylüyor sqrt(n).


n = 100Numaraları bileşik olarak işaretlemenin sabit zaman mark_composite()alacağını varsayarsak (dizi uygulaması), eleği ilk 100 sayı ( ) üzerinde çalıştırdığımı varsayalım , kullandığımız sayının

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

Ve sonraki asal sayıyı bulmak için (örneğin 7, katları olan tüm sayıların üstünü çizdikten sonra atlamak 5), işlem sayısı olacaktır O(n).

Yani karmaşıklık olur O(n^3). Katılıyor musun?


5
Geri kalanını bilmiyorum (şu anda çok uykulu beynim için çok matematiksel), ancak karekök, bir sayının karekökünden daha az bölen yoksa asal olması gerçeğinden kaynaklanıyor. Ayrıca, loglog (n) 'nin bir karekök olduğu anlamına geldiğini öğrendim. Güzel.
R. Martinho Fernandes

13
Loglog (n) 'nin orada olması nasıl bir yerde sqrt (n) olduğu anlamına gelir? (@Martinho: Neden "bunu yeni öğrendin" diyorsun?) Gerçek analiz herhangi bir karekök içermiyor!
ShreevatsaR

Yanıtlar:


121
  1. Sizin n / 2 + n / 3 + n / 5 +… n / 97, O (n) değildir, çünkü terimlerin sayısı sabit değildir. [Düzenlemenizden sonra düzenleyin: O (n 2 ) çok gevşek bir üst sınırdır.] Gevşek bir üst sınır n'dir (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +… 1 / n) (n'ye kadar olan tüm sayıların karşılıklılarının toplamı ), ki bu O (n log n): Harmonik sayıya bakınız . Daha uygun bir üst sınır n'dir (1/2 + 1/3 + 1/5 + 1/7 +…), yani n'ye kadar olan asalların karşılıklılarının toplamı, yani O (n log log n). ( Buraya veya buraya bakın .)

  2. "Sonraki asal sayıyı bul" biti genel olarak yalnızca O (n) 'dur, amortismana tabi tutulmuştur - sonraki sayıyı adım başına değil , toplamda yalnızca n kez bulmak için ilerleyeceksiniz . Yani algoritmanın tüm bu kısmı sadece O (n) alıyor.

Bu ikisini kullanarak, O (n log log n) + O (n) = O (n log log n) aritmetik işlemlerin üst sınırını elde edersiniz. Bit işlemlerini sayarsanız, n'ye kadar sayılarla uğraştığınız için, bunlar yaklaşık log n bitlerine sahiptir, bu da log n faktörünün geldiği ve O (n log n log log n) bit işlemleri veren yerdir.


Problemin bir kısmı için asimptotik karmaşıklığı düşünüyorsunuz. Diğer kısım için, amortize edilmiş yakınlığı düşünüyorsunuz. Kafam karıştı.
crisron 09

2
@crisron Sorun nedir? "Asimptotik karmaşıklık" ve "amorti edilmiş karmaşıklık" aynı şeyin iki farklı türü değildir. Amortisman, asimptotik karmaşıklık olabilen bir şeyi daha dikkatli sayma tekniğidir.
ShreevatsaR

Bunların hepsini farklı olarak düşünürdüm. Açıkladığın için teşekkürler.
crisron

1
@ShreevatsaR Neden harmonik serilerin toplamını n terime kadar hesaplıyoruz? En fazla sqrt (n) terim hesaplamamız gerekmez mi? Cevabı n (loglogsqrt (n)) aritmetik işlemlerin teta'sı olarak vermek? Ayrıca Wikipedia, uzay karmaşıklığının O (n) olduğunu söylüyor. Her durumda n elemanlı bir diziye ihtiyacımız olduğu için bu n'nin teta olması gerekmez mi?
a_123

@ s_123 Evet, sadece √n terime kadar hesaplayabilirsiniz, ancak bu, asimptotik analizde bir fark yaratmaz (hatta çalışma süresinde önemli bir pratik fark yaratmaz) çünkü log (√x) = (1/2) herhangi bir x için günlük x. Yani Θ (n log log √n) = Θ (n log log n). Diğer sorunuza göre, evet uzay karmaşıklığı aynı zamanda O (n) olan Θ (n) 'dir: üst sınırı belirtmek için Θ () demek yerine O () kullanmak gelenekseldir. bu aynı zamanda alt sınırdır (özellikle burada olduğu gibi alt sınır açık olduğunda).
ShreevatsaR

7

Karmaşıklığın loglogn terimini içermesi bana bir yerde sqrt (n) olduğunu söylüyor.

PEleme sırasında bir asal sayı bulduğunuzda , mevcut konumunuzdaki sayıları kesmeye başlamayacağınızı unutmayın + P; aslında sayıları üzerinden geçmeye başlıyorsunuz P^2. Tüm katları Paz P^2önceki asal sayılar tarafından kapalı geçti olacaktır.


10
bu ifade kendi içinde doğrudur, ancak kendisinin hiçbir değeri olmayan alıntılanan ifadeyle hiçbir ilgisi yoktur. Biz dan başlayıp başlamayacağı pveya p^2karmaşıklık (direkt erişim dizilerle) aynıdır. SUM (1/p) {p<N} ~ log (log N)nedeni.
Will Ness

6
  1. İç döngü n/iadımlar yapar , burada iasal => tüm karmaşıklıktır sum(n/i) = n * sum(1/i). Asal harmonik serinin göre, sum (1/i)nerede iasal olduğunu log (log n). Toplamda O(n*log(log n)).
  2. Bence üst döngü, genel zaman karmaşıklığı nile değiştirilerek optimize edilebilir :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
hayır, n'nin sqrt (n) ile değiştirilmesi onu hala log log n olan günlük log (sqrt n) yapar. ve isprimekesinlikle orada kullanmak için yanlış bir isim.
Will Ness

-1

Yukarıdaki açıklamaya bakın, iç döngü sqrt (n) 'ye kadar olan tüm asal sayıların harmonik toplamıdır. Yani, gerçek karmaşıklık O (sqrt (n) * log (log (sqrt (n))))


2
yanlış. N'ye kadar tüm yolu işaretleriz: N / 2 + N / 3 + N / 5 + N / 7 + N / 11 + ... = N (1/2 + 1/3 + 1/5 + 1/7 + 1/11 + ...) ~ N günlük günlük (sqrt N) ~ N günlük günlük N.
Will Ness
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.