Złożoność algorytmu to
O(n(logn)(loglogn))
operacje bitowe.
Jak do tego doszedłeś?
To, że złożoność obejmuje ten loglogn
termin, mówi mi, że sqrt(n)
gdzieś jest.
Załóżmy, że uruchamiam sito na pierwszych 100 liczbach ( n = 100
), zakładając, że oznaczenie liczb jako złożonych zajmuje stały czas (implementacja tablicy), liczba razy, której użyjemy, mark_composite()
byłaby podobna
n/2 + n/3 + n/5 + n/7 + ... + n/97 = O(n^2)
Aby znaleźć następną liczbę pierwszą (na przykład do przeskoczenia 7
po przekreśleniu wszystkich liczb, które są wielokrotnościami 5
), liczba operacji wyniosłaby O(n)
.
Więc złożoność byłaby O(n^3)
. Czy sie zgadzasz?
Odpowiedzi:
Twoje n / 2 + n / 3 + n / 5 +… n / 97 nie jest O (n), ponieważ liczba wyrazów nie jest stała. [Edytuj po edycji: O (n 2 ) jest zbyt luźne, górna granica]. Luźna górna granica to n (1 + 1/2 + 1/3 + 1/4 + 1/5 + 1/6 +… 1 / n) (suma odwrotności wszystkich liczb do n), czyli O (n log n): patrz Liczba harmoniczna . Bardziej odpowiednią górną granicą jest n (1/2 + 1/3 + 1/5 + 1/7 +…), czyli suma odwrotności liczb pierwszych do n, czyli O (n log log n). (Zobacz tutaj lub tutaj .)
Bit „znajdź następną liczbę pierwszą” to tylko O (n) ogółem, amortyzowany - przejdziesz dalej, aby znaleźć następną liczbę w sumie tylko n razy , a nie na krok. Więc cała ta część algorytmu zajmuje tylko O (n).
Więc używając tych dwóch, otrzymujesz górną granicę O (n log log n) + O (n) = O (n log log n) operacji arytmetycznych. Jeśli liczysz operacje bitowe, ponieważ masz do czynienia z liczbami do n, mają one około log n bitów, czyli tam, gdzie pojawia się współczynnik log n, dając O (n log n log n) operacji bitowych.
źródło
Pamiętaj, że kiedy znajdziesz liczbę pierwszą
P
podczas przesiewania, nie zaczynasz wykreślać liczb na swojej aktualnej pozycji +P
; faktycznie zaczynasz wykreślać liczby odP^2
. Wszystkie wielokrotnościP
mniejsze niżP^2
zostaną skreślone przez poprzednie liczby pierwsze.źródło
p
czyp^2
, złożoność jest taka sama (z tablicami bezpośredniego dostępu).SUM (1/p) {p<N} ~ log (log N)
Jest powodem.n/i
kroki, gdziei
jest pierwsza => cała złożoność jestsum(n/i) = n * sum(1/i)
. Zgodnie z szeregiem pierwszych harmonicznych,sum (1/i)
gdziei
jest liczba pierwszalog (log n)
. W sumieO(n*log(log n))
.Myślę, że górną pętlę można zoptymalizować, zastępując
n
jąsqrt(n)
tak, aby ogólna złożoność czasowaO(sqrt(n)loglog(n))
:źródło
isprime
jest to absolutnie niewłaściwa nazwa.patrz, weź powyższe wyjaśnienie, pętla wewnętrzna jest harmoniczną sumą wszystkich liczb pierwszych do sqrt (n). Tak więc rzeczywista złożoność wynosi O (sqrt (n) * log (log (sqrt (n))))
źródło