Каковы временные сложности различных структур данных?

86

Я пытаюсь перечислить временные сложности операций с общими структурами данных, такими как массивы, двоичное дерево поиска, куча, связанный список и т. Д., И особенно я имею в виду Java. Они очень распространены, но я думаю, что некоторые из нас не уверены на 100% в точном ответе. Любая помощь, особенно ссылки, приветствуется.

Например, для односвязного списка: изменение внутреннего элемента - O (1). Как это сделать? Вы ДОЛЖНЫ выполнить поиск элемента перед его изменением. Кроме того, для вектора добавление внутреннего элемента задается как O (n). Но почему мы не можем сделать это за амортизированное постоянное время, используя индекс? Пожалуйста, поправьте меня, если я что-то упускаю.

Я публикую свои выводы / догадки в качестве первого ответа.

Бхушан
источник
2
Временные и пространственные сложности для всех структур данных
Шпаргалка по
1
Если кто-то еще
вмешается, найдите

Ответы:

244

Массивы

  • Установить, проверить элемент по определенному индексу: O (1)
  • Поиск : O (n), если массив не отсортирован, и O (log n), если массив отсортирован и используется что-то вроде двоичного поиска,
  • Как указал Айвен , Deleteоперации с массивами недоступны. Мы можем символически удалить элемент, установив для него определенное значение, например -1, 0 и т. Д. В зависимости от наших требований.
  • Точно так же Insertдля массивов в основном, Setкак упоминалось в начале

ArrayList:

  • Добавить : Амортизированный O (1)
  • Удалить : O (n)
  • Содержит : O (n)
  • Размер : O (1)

Связанный список:

  • Вставка : O (1) , если выполняется в начале , O (n), если где-либо еще, поскольку мы должны достичь этой позиции, перемещаясь по связанному списку линейно.
  • Удаление : O (1) , если выполняется в начале , O (n), если где-либо еще, поскольку мы должны достичь этой позиции, перемещаясь по связанному списку линейно.
  • Ищем : O (n)

Двусвязный список:

  • Вставка : O (1) , если выполняется в голове или хвосте, O (n), если где-либо еще, поскольку мы должны достичь этой позиции, перемещаясь по связному списку линейно.
  • Удаление : O (1) , если выполняется в голове или хвосте, O (n), если где-либо еще, поскольку мы должны достичь этой позиции, перемещаясь по связанному списку линейно.
  • Ищем : O (n)

Стек:

  • Толкать : O (1)
  • Поп : O (1)
  • Сверху : O (1)
  • Поиск (что-то вроде поиска, как специальная операция): O (n) (я так думаю)

Очередь / Deque / Круговая очередь:

  • Вставка : O (1)
  • Удалить : O (1)
  • Размер : O (1)

Дерево двоичного поиска:

  • Вставка, удаление и поиск : средний случай: O (журнал n) , худший случай: O (n)

Красно-черное дерево:

  • Вставка, удаление и поиск : средний случай: O (журнал n) , худший случай: O (журнал n)

Куча / PriorityQueue (мин. / Макс.):

  • Найти минимум / найти максимум : O (1)
  • Вставить : O (log n)
  • Удалить мин. / Удалить макс . : O (log n)
  • Извлечение мин. / Извлечение макс . : O (log n)
  • Поиск, удаление (если есть): O (n) , нам придется сканировать все элементы, поскольку они не упорядочены, как BST

HashMap / Hashtable / HashSet:

  • Вставить / удалить : O (1) амортизировано
  • Изменение размера / хеш : O (n)
  • Содержит : O (1)
Бхушан
источник
3
Вставка элемента в массив (и под вставкой я имею в виду добавление нового элемента в позицию, смещение всех элементов вправо) займет O (n). То же самое для удаления. Только замена существующего элемента займет O (n). Также возможно, что вы смешали его с добавлением нового элемента в массив изменяемого размера (он амортизировал время O (1)).
Aivean
Также обратите внимание, что для вставки и удаления двусвязного списка как для головы, так и для хвоста потребуется O (1) (вы упомянули только голову).
Aivean
И последнее замечание: сбалансированные деревья поиска (например, красно-черное дерево, которое фактически используется для TreeMap в Java) имеют гарантированное время O (ln n) в худшем случае для всех операций.
Aivean
@Aivean: Я просто пытаюсь перечислить стандартные операции для стандартных структур данных. Для массивов: смещение элементов при добавлении / удалении не является стандартной операцией. Кроме того, замена существующего элемента требует O (1) с использованием индекса, а не O (n). Для двусвязного списка: Вы правы, я вношу поправку. Для красно-черных деревьев: опять же, вы правы. Но я перечислил только BST, балансировать которые не нужно. Итак, я добавлю новую запись для красно-черных деревьев. Спасибо за комментарии!
Bhushan
1
@SuhailGupta: Сложность для Set уже указана в качестве последнего пункта.
Bhushan