Приклади алгоритмів, які мають складності O (1), O (n log n) та O (log n)


114

Які алгоритми, які ми використовуємо щодня, мають складності O (1), O (n log n) та O (log n)?


6
Чому вікі? Це ні опитування, ні суб'єктивне. Вона хоче конкретних прикладів властивостей big-O.
paxdiablo

4
Wiki не має єдиної правильної відповіді. Є багато відповідей.
Jason S

2
У Вікіпедії теж хороший список. en.wikipedia.org/wiki/Time_complexity
Homer6

Відповіді:


234

Якщо ви хочете приклади алгоритмів / Групи висловлювань зі складністю часу, наведених у питанні, ось невеликий список -

O(1) час

  • Доступ до індексу масиву (int a = ARR [5];)
  • Вставлення вузла у пов'язаний список
  • Натискання та поппінг на стеці
  • Вставлення та видалення з черги
  • З'ясування батьківського або лівого / правого дочірнього вузла у дереві, що зберігається в масиві
  • Перехід до наступного / попереднього елемента в списку, що зв'язаний удвох

O(n) час

У двох словах, всі алгоритми грубої сили або Noob, які потребують лінійності, ґрунтуються на часовій складності O (n)

  • Проходження масиву
  • Проходження пов’язаного списку
  • Лінійний пошук
  • Видалення конкретного елемента у пов'язаному списку (не відсортовано)
  • Порівняння двох рядків
  • Перевірка на наявність Паліндром
  • Підрахунок / Відбір Сортування і тут ви можете знайти ще мільйон таких прикладів ....

O(log n) час

  • Двійковий пошук
  • Пошук найбільшого / найменшого числа у двійковому дереві пошуку
  • Певні алгоритми розділення та підкорення на основі лінійної функціональності
  • Розрахунок чисел Фібоначчі - найкращий метод Основна передумова тут - НЕ використання повних даних, а зменшення розміру проблеми з кожною ітерацією

O(n log n) час

Коефіцієнт 'log n' вводиться шляхом врахування «Поділитись і перемогти». Деякі з цих алгоритмів є оптимізованими та часто використовуються.

  • Об’єднати сортування
  • Сортування купи
  • Швидкий сортування
  • Певні алгоритми ділення та перетворення на основі оптимізації алгоритмів O (n ^ 2)

O(n^2) час

Вони повинні бути менш ефективними алгоритмами, якщо їхні O (nlogn) аналоги є. Загальна заявка тут може бути Brute Force.

  • Сортування бульбашок
  • Сортування вставки
  • Сортування вибору
  • Проходження простого 2D масиву

5
Що з n !? Мені було цікаво, який загальний алгоритм використовує n !?
Y_Y

Доступ до значення HashMap, а також до складніших алгоритмів, таких як реалізація LRU, які досягають O (1), використовуючи HashMap і подвійно пов'язаний список або реалізуючи стек з функцією PUSH / POP / MIN. Також рекурсивна реалізація Фібоначчі потрапляє під N !.
ruralcoder

11
Мій OCD хоче, щоб ви перейшли до O(log n)списку, щоб O(n)список був у порядку від найкращого до гіршого. ха-ха :)
Сем Етон

4
Проходження 2D масиву насправді є O (nxm), якщо це не квадратна матриця.
Саймон Пек

1
Проблема "мандрівного продавця" є прикладом n! (n factorial) також
Ju66ernaut

28

Простий приклад O(1)може бути return 23;- незалежно від вкладених даних, це повернеться за фіксований, обмежений час.

Типовим прикладом O(N log N)може бути сортування вхідного масиву з хорошим алгоритмом (наприклад, об'єднання).

Типовий приклад, якби O(log N)шукати значення в відсортованому вхідному масиві шляхом бісекції.


28

O (1) - більшість процедур приготування є O (1), тобто потрібен постійний проміжок часу, навіть якщо для приготування їжі більше людей (до певної міри, тому що у вашій посуді / каструлі може не вистачити місця і потрібно розділити приготування)

O (вхід) - пошук чогось у телефонній книзі. Подумайте про двійковий пошук.

O (n) - читання книги, де n - кількість сторінок. Це мінімальна кількість часу, яке потрібно для читання книги.

O (nlogn) - не можу відразу придумати щось, що можна зробити щодня, що є nlogn ... якщо тільки ви не сортуєте карти, зробивши злиття чи швидке сортування!


2
Для приготування смаженої страви потрібно набагато більше часу :-)
paxdiablo

4
але зазвичай потрібно один і той же час, щоб приготувати два міні-смажених проти одного міні-смаженого, за умови, що ваша духовка досить велика, щоб вмістити її!
Chii

1
Дуже проникливий! Я думаю, що завдання скласти телефонну чи адресну книгу зі списку імен / номерів може бути O (n log n)
squashed.bugaboo

10

Я можу запропонувати вам декілька загальних алгоритмів ...

  • O (1): доступ до елемента в масиві (тобто int i = a [9])
  • O (n log n): швидкий або злитий (в середньому)
  • O (журнал n): двійковий пошук

Це були б відповіді кишечника, оскільки це звучить як питання домашнього завдання / інтерв'ю. Якщо ви шукаєте щось більш конкретне, це трохи складніше, оскільки громадськість взагалі не матиме уявлення про базову реалізацію популярного додатку (Збереження відкритого коду, звичайно), а також концепція взагалі не застосовується до "програми"


4

O (1): пошук найкращого наступного кроку в Шахах (або Перейти до цього питання). Оскільки кількість ігрових станів кінцеве, це лише O (1) :-)


5
Так, зазвичай можна торгувати часом для простору. Я фактично робив це для гри з тик-так-носком, оскільки існує лише 3 ^ 9 станів (менше, якщо ви розумно обробляєте ротації). Однак у шахах є дещо більша кількість штатів :-)
paxdiablo

1
Проблема в тому, що я житиму лише O(1)наносекундами, і ви точно знаєте, що O(1)відбудеться першим ...
zardav

3

Складність застосування програмного забезпечення не вимірюється і не записується в нотації big-O. Корисно лише виміряти складність алгоритму та порівняти алгоритми в одній області. Швидше за все, коли ми говоримо O (n), ми маємо на увазі, що це "O (n) порівняння " або "O (n) арифметичні операції". Це означає, що ви не можете порівнювати жодну пару алгоритмів чи програм.


1
Це не зовсім так. Якщо алгоритм має складну часову складність O (N), це означає, що його час виконання обмежується кроками k * N для деякої постійної k. Насправді не важливо, "кроки" - це цикли процесора, інструкція по збірці або (прості) операції з C. Ці деталі приховані постійною k.
Ігор Островський

Не кажучи вже про те, що у багатьох практичних випадках "c" алгоритму O (logN) робить його гірше, ніж простіший (N) алгоритм.
Зед

Так, так, і під N ми тоді маємо на увазі тривалість введення стрічки на машині Тьюрінга - що робить вертикальну форму поділу для впровадження експоненціального часу. :-) Кожен домен має свої вимоги та власну ділянку реферату.
П Швед

3

O (1) - Видалення елемента із подвійно пов'язаного списку. напр

typedef struct _node {
    struct _node *next;
    struct _node *prev;
    int data;
} node;


void delete(node **head, node *to_delete)
{
    .
    .
    .
}

2

Ви можете додати до свого списку такі алгоритми:

O(1)- Визначення, чи число парне чи непарне; Робота з HashMap

O(logN) - обчислення x ^ N,

O(N Log N) - Найдовше зростаюча сукупність


1

O (n log n) - це, мабуть, верхня межа того, наскільки швидко ви можете сортувати довільний набір (припускаючи стандартну і не дуже паралельну обчислювальну модель).


0

0 (logn) -Двійковий пошук, піковий елемент у масиві (може бути більше одного піку) 0 (1) -в python, обчислюючи довжину списку або рядка. Функція len () займає 0 (1) час. Доступ до елемента в масиві займає 0 (1) час. Операція натискання в стеку займає 0 (1) час. 0 (nlogn) -Між сортуванням. сортування в python займає nlogn час. тому, коли ви використовуєте listname.sort (), це займає nlogn час.

Примітка: Пошук в хеш-таблиці іноді займає більше, ніж постійний час, через зіткнення.


0

O (2 N )

O (2 N ) позначає алгоритм, зростання якого подвоюється з кожним доповненням до набору вхідних даних. Крива зростання функції O (2 N ) є експоненціальною - починаючи дуже дрібно, потім метеорично піднімаючись. Прикладом функції O (2 N ) є рекурсивний розрахунок чисел Фібоначчі:

int Fibonacci (int number)
{
if (number <= 1) return number;
return Fibonacci(number - 2) + Fibonacci(number - 1);
}

Tower of Hanoiбув би кращим прикладом.
Ашиш Дуклан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.