Складність у часі операцій з набором пітонів?


85

Яка часова складність кожної з операцій набору пітона у позначенні Big O ?

Я використовую тип набору Python для операції над великою кількістю елементів. Я хочу знати, як розмір набору впливатиме на продуктивність кожної операції. Наприклад, додайте і тест на членство:

myset = set()
myset.add('foo')
'foo' in myset

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

Якщо він існує, посилання на те , як це було б здорово. Якщо нічого подібного там немає, то, можливо, ми можемо це виправити?

Додаткові оцінки для знаходження часової складності всіх наборів операцій.


2
Хоча посилання GWW є дуже інформативним, ви можете міркувати про часову складність наборів python, розуміючи, що це просто особливі випадки словника python (ключі, але без значень). Отже, якщо ви знаєте часову складність операцій на хеш-карті, ви майже там.
Wilduck

Відповіді:


73

Відповідно до вікі Python: Складність часу , набір реалізований як хеш-таблиця . Тож ви можете розраховувати на пошук / вставку / видалення в середньому за O (1) . Якщо коефіцієнт завантаження вашої хеш-таблиці не занадто високий, ви стикаєтесь із зіткненнями та O (n).

PS чомусь вони вимагають O (n) за операцію видалення, яка виглядає як помилковий тип.

PPS Це справедливо для CPython, pypy - це зовсім інша історія .


Встановлений у python також робить автоматичне сортування. Тож ти вважаєш, що вставлення нового значення все ще є O (1)
часовою

3
@thakurinbox чи можете ви підтримати свою заяву посиланням?
Сергій Романовський

5

Операція inповинна бути незалежною від розміру контейнера, тобто. O (1) - задана оптимальна хеш-функція. Це повинно бути майже вірно для рядків Python. Хешування рядків завжди критично важливо, там Python повинен бути розумним, і, отже, ви можете очікувати майже оптимальних результатів.


2

В інших відповідях не йдеться про 2 найважливіші операції на множинах: об’єднання та перехрестя. У гіршому випадку об'єднання прийме O (n + m), тоді як перетин прийме O (min (x, y)) за умови, що в наборах не багато елементів з однаковим хешем. Список часових складностей загальних операцій можна знайти тут: https://wiki.python.org/moin/TimeComplexity

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