Яка часова складність різних структур даних?


86

Я намагаюся перерахувати часові складності операцій із типовими структурами даних, такими як масиви, бінарне дерево пошуку, куча, зв’язаний список тощо, і особливо я маю на увазі Java. Вони дуже поширені, але, мабуть, деякі з нас не на 100% впевнені в точній відповіді. Будь-яка допомога, особливо посилання, дуже вдячна.

Наприклад, для списку з єдиним зв’язком: Зміна внутрішнього елемента - O (1). Як ви можете це зробити? Ви ПОВИННІ шукати елемент , перш ніж змінити його. Крім того, для вектора додавання внутрішнього елемента подається як O (n). Але чому ми не можемо зробити це за амортизований постійний час, використовуючи індекс? Будь ласка, виправте мене, якщо мені чогось не вистачає.

Я публікую свої висновки / здогади як першу відповідь.


2
Складність часу та простору для всіх структур даних Big O шпаргалка
Vbp

1
Якщо хтось ще вступить у це, знайдіть хвилину, щоб також перевірити це посилання: infotechgems.blogspot.gr/2011/11/…
vefthym

Відповіді:


244

Масиви

  • Встановити, перевірити елемент за певним індексом: O (1)
  • Пошук : O (n), якщо масив відсортований, і O (n), якщо масив відсортований і використовується щось на зразок двійкового пошуку,
  • Як зазначив Aivean , Deleteна Arrays не доступна жодна операція. Ми можемо символічно видалити елемент, встановивши для нього певне значення, наприклад -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) (я думаю, так)

Черга / деке / кругова черга:

  • Вставка : O (1)
  • Видалити : O (1)
  • Розмір : O (1)

Бінарне дерево пошуку:

  • Вставлення, видалення та пошук : Середній регістр: O (журнал n) , Найгірший регістр: O (n)

Червоно-Чорне дерево:

  • Вставлення, видалення та пошук : Середній регістр: O (журнал n) , Найгірший регістр: O (журнал n)

Куча / Пріоритетна черга (хв / макс):

  • Знайти мінімум / знайти максимум : O (1)
  • Вставити : O (журнал n)
  • Видалити мінімум / видалити максимум : O (журнал 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: Складність для набору вже вказана як остання точка.
Bhushan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.