2016-04-07 6 views
1

In einem Interview, das ich diese Fragen gegeben wurde:Komplexität von Druck ersten n Primzahl

Write a function to print first n prime numbers 

Die Funktion sieht wie folgt aus:

Live on ideone

while (true) { 
    boolean isPrime = true; 
    for (int divisor = 2; divisor <= (int)(Math.sqrt(number)); divisor++) { 
    if (number % divisor == 0) { 
     isPrime = false;  
     break; 
    } 
    } 
    number++; 
    if(isPrime) { 
    System.out.print(number + " "); 
    primes++; 
    } 

    if (primes == n) 
     break; 
} 

Eine einfache Komplexitätsanalyse führte könnte zu O(n√n)
Aber der Interviewer sagte, dass die Outerloop geht nicht einfach n bec Zum Beispiel, um die ersten 100 Primzahlen zu finden, die wir nach 541 (also die 100. Primzahlen) durchlaufen müssen.

Also, wie drücken wir die Zeitkomplexität aus?

+3

Als eine Randnotiz: Ich würde lieber Divison Divisor <= Nummer 'im Gegensatz zum Aufruf von' Math.sqrt() 'und geben Casting. – blazs

Antwort

3

Dies zu beantworten erfordert hohe Mathematik, nämlich das Verteilungsgesetz der Primzahlen. Es sagt Ihnen (https://en.wikipedia.org/wiki/Prime_number_theorem), dass der Wert der n -ten Primzahl ungefähr n.log(n) ist.

Dann ist Ihre Komplexität O(n√n.log(n)√log(n)).


Ich könnte sich herausstellen, dass diese Schranke pessimistisch ist, weil nicht alle Iterationen bis √n laufen. Zum Beispiel werden gerade Zahlen sofort erkannt. Für eine engere Grenze benötigen Sie das Verteilungsgesetz des kleinsten Faktors der ganzen Zahlen.

+1

Es ist eine sehr bekannte Tatsache. Wenn Sie einen Kryptographiekurs über RSA absolviert hätten, hätten Sie davon erfahren. Vielleicht haben Sie so etwas in Ihrem Lebenslauf (z. B. Kryptographie) behauptet und dann beschlossen, Sie darauf zu testen. – blazs

+2

Ich stimme zu. Du hättest antworten können: "Ich kann keine genaue Antwort geben, weil ich die Beziehung zwischen' n' und der 'n'-ten Primzahl nicht kenne." –

+0

@ Yves: das ist, was ich gesagt habe –