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

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

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

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

Ответ 1

Массивы

  • Установить, проверить элемент по определенному индексу: O (1)
  • Поиск: O (n), если массив несортирован и O (log n), если массив отсортирован и что-то вроде двоичного поиска,
  • Как указано Aivean, в Arrays нет операции 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) (я полагаю)

Queue/Deque/Circular Queue:

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

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

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

Дерево с красным-черным:

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

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

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

HashMap/Hashtable/HashSet:

  • Вставить/Удалить: O (1) амортизировано
  • Re-size/hash: O (n)
  • Содержит: O (1)