Примеры алгоритмов со сложностями O (1), O (n log n) и O (log n)


114

Какие алгоритмы, которые мы используем ежедневно, имеют сложность O (1), O (n log n) и O (log n)?


6
Почему вики? Это ни опрос, ни субъективное мнение. Ей нужны конкретные примеры свойств большого О.
— paxdiablo

4
Wiki, потому что у нее нет единственного правильного ответа, у нее есть несколько ответов.
— Jason S

2
В Википедии тоже есть хороший список. en.wikipedia.org/wiki/Time_complexity
— Homer6,

Ответы:


235

Если вам нужны примеры алгоритмов / группы операторов со сложностью времени, как указано в вопросе, вот небольшой список -

O(1) время

  • Доступ к индексу массива (int a = ARR [5];)
  • Вставка узла в связанный список
  • Нажатие на стек
  • Вставка и удаление из очереди
  • Определение родителя или левого / правого дочернего элемента узла в дереве, хранящемся в массиве
  • Переход к следующему / предыдущему элементу в двусвязном списке

O(n) время

Вкратце, все алгоритмы грубой силы или алгоритмы Noob, требующие линейности, основаны на временной сложности O (n).

  • Обход массива
  • Обход связанного списка
  • Линейный поиск
  • Удаление определенного элемента в связанном списке (не отсортировано)
  • Сравнение двух строк
  • Проверка на палиндром
  • Counting / Bucket Sort, и здесь вы также можете найти еще миллион таких примеров ....

O(log n) время

  • Бинарный поиск
  • Поиск наибольшего / наименьшего числа в двоичном дереве поиска
  • Определенные алгоритмы разделения и владения, основанные на линейной функциональности
  • Вычисление чисел Фибоначчи - лучший метод Основная предпосылка здесь - НЕ использовать полные данные и уменьшать размер проблемы с каждой итерацией.

O(n log n) время

Фактор log n вводится с учетом принципа «Разделяй и властвуй». Некоторые из этих алгоритмов являются наиболее оптимизированными и часто используются.

  • Сортировка слиянием
  • Сортировка кучи
  • Быстрая сортировка
  • Некоторые алгоритмы «разделяй и властвуй», основанные на оптимизации алгоритмов O (n ^ 2)

O(n^2) время

Предполагается, что эти алгоритмы будут менее эффективными, если присутствуют их аналоги O (nlogn). Общее приложение может быть здесь грубой силой.

  • Пузырьковая сортировка
  • Сортировка вставкой
  • Выбор Сортировка
  • Обход простого 2D-массива

5
А как насчет п !? Мне было интересно, какой общий алгоритм использует n !?
— Y_Y

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

11
Мой ОКР хочет, чтобы вы переключили 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 (n) - чтение книги, где n - количество страниц. Это минимальное время, необходимое для чтения книги.

O (nlogn) - не могу сразу придумать что-то, что можно делать каждый день, кроме nlogn ... если только вы не отсортируете карты, выполнив слияние или быструю сортировку!


2
Жаркое
— готовится

4
но обычно приготовление двух мини-жареных блюд и одного мини-жаркого занимает одинаковое время, при условии, что ваша духовка достаточно велика, чтобы вместить его!
— Chii

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

10

Могу предложить вам несколько общих алгоритмов ...

  • O (1): доступ к элементу в массиве (например, int i = a [9])
  • O (n log n): быстрая сортировка или сортировка слиянием (в среднем)
  • O (log n): двоичный поиск

Это будут интуитивные ответы, поскольку это звучит как вопрос типа домашнего задания / собеседования. Если вы ищете что-то более конкретное, это немного сложнее, поскольку общественность в целом не будет иметь представления о базовой реализации (конечно, с сохранением открытого исходного кода) популярного приложения, и эта концепция в целом не применима к «приложению»


4

O (1): найти лучший следующий ход в шахматах (или го, если на то пошло). Поскольку количество состояний игры конечно, это всего лишь O (1) :-)


5
Да, обычно вы можете обменивать время на пространство. Я на самом деле сделал это для игры в крестики-нолики, так как есть только 3 ^ 9 состояний (меньше, если вы разумно обрабатываете вращения). У шахмат, однако, несколько большее количество состояний :-)
— paxdiablo

1
Проблема в том, что я O(1)O(1)
— проживу

3

Сложность программного приложения не измеряется и не записывается в нотации с большой буквы. Полезно только измерять сложность алгоритма и сравнивать алгоритмы в одной и той же области. Скорее всего, когда мы говорим O (n), мы имеем в виду, что это «O (n) сравнений » или «O (n) арифметических операций». Это означает, что вы не можете сравнивать никакую пару алгоритмов или приложений.


1
Это не совсем так. Если алгоритм имеет временную сложность O (N), это означает, что время его выполнения ограничено k * N шагами для некоторой константы k. На самом деле не важно, являются ли «шаги» циклами ЦП, инструкциями сборки или (простыми) операциями C. Эти детали скрыты константой k.
— Игорь Островский

Не говоря уже о том, что во многих практических случаях "c" алгоритма O (logN) делает его хуже, чем более простой алгоритм O (N).
— Zed

Ха-ха, да, и под 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 (), требуется время входа n.

Примечание. Поиск в хеш-таблице иногда занимает больше времени из-за коллизий.


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.