Огляд
Інші наводили хороші приклади діаграм, наприклад, діаграми дерева. Я не бачив простих прикладів коду. Тож крім мого пояснення, я надам деякі алгоритми з простими твердженнями про друк, щоб проілюструвати складність різних категорій алгоритмів.
По-перше, вам захочеться мати загальне уявлення про логарифм, який ви можете отримати на веб-сайті https://en.wikipedia.org/wiki/Logarithm . Природознавство e
та природний журнал. Учні-інженери використовуватимуть log_10 (журнал бази 10), а вчені-комп’ютери багато використовуватимуть log_2 (журнал бази 2), оскільки комп'ютери мають бінарну основу. Іноді ви бачите абревіатури природного журналу як ln()
, інженери зазвичай залишають _10 вимкненим і просто використовують, log()
а log_2 скорочується як lg()
. Усі типи логарифмів ростуть аналогічно, тому вони поділяють одну і ту ж категорію log(n)
.
Переглядаючи приклади коду нижче, я рекомендую подивитися на O (1), потім O (n), потім O (n ^ 2). Після того, як ви добре з ними, тоді подивіться на інших. Я включив чисті приклади, а також варіанти, щоб продемонструвати, як тонкі зміни все ще можуть призвести до тієї ж категоризації.
Ви можете вважати O (1), O (n), O (logn) тощо як класи або категорії зростання. Для деяких категорій знадобиться більше часу, ніж для інших. Ці категорії допомагають дати спосіб упорядкувати роботу алгоритму. Деякі зростають швидше у міру зростання вхідних даних n. Наведена нижче таблиця демонструє чисельне зростання. У таблиці нижче вважайте log (n) як стелю log_2.
Прості кодові приклади різних категорій Big O:
O (1) - Приклади постійного часу:
Алгоритм 1 друкує привіт один раз, і це не залежить від n, тому він завжди буде працювати в постійний час, так і є O(1)
.
print "hello";
Алгоритм 2 друкує привіт 3 рази, однак це не залежить від розміру вводу. Навіть з ростом n цей алгоритм завжди буде надрукувати лише 3 рази. Це, як говорять 3, є постійною, тому цей алгоритм також є O(1)
.
print "hello";
print "hello";
print "hello";
O (log (n)) - логарифмічні приклади:
- Алгоритм 3 - Це діє як "log_2"
Алгоритм 3 демонструє алгоритм, який працює в log_2 (n). Зауважте, що операція циклу for для циклу кратна поточному значенню i на 2, тому i
йде від 1 до 2 до 4 до 8 до 16 до 32 ...
for(int i = 1; i <= n; i = i * 2)
print "hello";
- Алгоритм 4 - Це діє як "log_3"
Алгоритм 4 демонструє log_3. Повідомлення i
йде від 1 до 3 до 9 до 27 ...
for(int i = 1; i <= n; i = i * 3)
print "hello";
- Алгоритм 5 - Це діє як "log_1.02"
Алгоритм 5 важливий, оскільки він допомагає показати, що поки число більше 1 і результат неодноразово множиться на себе, ви дивитеся на логарифмічний алгоритм.
for(double i = 1; i < n; i = i * 1.02)
print "hello";
O (n) - Приклади лінійного часу:
Цей алгоритм простий, який друкує привіт n разів.
for(int i = 0; i < n; i++)
print "hello";
Цей алгоритм показує варіацію, де він буде надрукувати привіт п / 2 рази. n / 2 = 1/2 * n. Ми ігноруємо 1/2 константи і бачимо, що цей алгоритм є O (n).
for(int i = 0; i < n; i = i + 2)
print "hello";
O (n * log (n)) - nlog (n) Приклади:
Подумайте про це як про поєднання O(log(n))
та O(n)
. Вкладення циклів для петель допомагає нам отриматиO(n*log(n))
for(int i = 0; i < n; i++)
for(int j = 1; j < n; j = j * 2)
print "hello";
Алгоритм 9 схожий на алгоритм 8, але в кожній з циклів є варіанти, які все одно призводять до того, що кінцевий результат O(n*log(n))
for(int i = 0; i < n; i = i + 2)
for(int j = 1; j < n; j = j * 3)
print "hello";
O (n ^ 2) - n Приклади у квадраті:
O(n^2)
виходить легко шляхом гніздування стандарт для петель.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
print "hello";
Як алгоритм 10, але з деякими варіаціями.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j = j + 2)
print "hello";
O (n ^ 3) - n кубів Приклади:
Це як алгоритм 10, але з 3 петлями замість 2.
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++)
print "hello";
Як алгоритм 12, але з деякими варіаціями, які все ще дають результат O(n^3)
.
for(int i = 0; i < n; i++)
for(int j = 0; j < n + 5; j = j + 2)
for(int k = 0; k < n; k = k + 3)
print "hello";
Підсумок
Наведене вище дає кілька прямих прикладів та варіацій, які допоможуть продемонструвати, які тонкі зміни можуть бути внесені, що насправді не змінюють аналіз. Сподіваємось, це дає достатньо розуміння.