Складність у часі алгоритму Решето Ератосфена


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) означає, що є квадратний корінь. Приємно.
Р. Мартіньо Фернандес

13
Як журнал (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 (п) в цілому, амортизуються - ви будете рухатися вперед , щоб знайти наступний номер тільки п раз в загальній складності , які не на крок. Отже, вся ця частина алгоритму приймає лише 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 доданків. Чи не слід нам обчислювати лише до квадратних (n) термінів? Надаючи відповідь як тета n (loglogsqrt (n)) арифметичних операцій? Також у Вікіпедії сказано, що космічна складність - O (n). Хіба це не має бути тета n, оскільки нам у будь-якому випадку потрібен масив з n елементів?
a_123

@ s_123 Так, ви можете обчислити лише до terms n доданків, але це не робить різниці в асимптотичному аналізі (або навіть суттєвій практичній різниці в робочому часі), оскільки log (√x) = (1/2) log x для будь-якого x. Отже, Θ (n журнал журналу √n) = Θ (n журнал журналу n). На інше ваше запитання, так, складність простору дорівнює Θ (n), що також є O (n): звичайно використовувати O (), щоб вказати, що ви вказуєте верхню межу, замість сказати Θ (), щоб вказати що це також нижня межа (особливо коли нижня межа очевидна, як і тут).
ShreevatsaR

7

Те, що складність включає термін входу, говорить мені, що десь є 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кроки, де iis prime => вся складність 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 журналом журналу (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) ~ N журналу журналу N.
Will Ness
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.