Под этим я подразумеваю структуру с:
- O (log n) сложность для
x.push()
операций - O (log n) сложность поиска элемента
- O (n) сложность для вычисления,
list(x)
которая будет отсортирована
У меня также был связанный с этим вопрос о производительности, list(...).insert(...)
который сейчас здесь .
memcpy
по-прежнему является операцией O (n) . Я не уверен, как Python точно реализует списки , но держу пари, что они хранятся в непрерывной памяти (конечно, не в виде связанного списка). Если это действительно так, то вставка,bisect
которую вы демонстрируете, будет иметь сложность O (n) .Ответы:
Стандартный список Python не сортируется ни в какой форме. Стандартный модуль heapq можно использовать для добавления O (log n) к существующему списку и удаления наименьшего из O (log n), но это не отсортированный список в вашем определении.
Существуют различные реализации сбалансированных деревьев для Python, которые отвечают вашим требованиям, например, rbtree , RBTree или pyavl .
источник
Есть ли какая-то конкретная причина для ваших требований большого О? Или вы просто хотите, чтобы это было быстро? Модуль sortedcontainers - это чистый Python и быстрый (как в реализациях fast-as-C, таких как blist и rbtree).
В сравнении производительности показывает , что контрольные показатели быстрее или на одном уровне с отсортированного списка типа Blist в. Также обратите внимание, что rbtree, RBTree и PyAVL предоставляют отсортированный dict и типы наборов, но не имеют типа отсортированного списка.
Если производительность является требованием, всегда не забывайте проводить тесты. Модуль, который подтверждает утверждение о быстродействии с нотацией Big-O, должен вызывать подозрение, пока он также не покажет сравнительные тесты.
Отказ от ответственности: я являюсь автором модуля Python sortedcontainers.
Монтаж:
Использование:
источник
0.0845024989976
для SortedList.add () и0.596589182518
для bisect.insort (), таким образом, разница в скорости в 7 раз! И я ожидаю, что разрыв в скорости увеличится с увеличением длины списка, поскольку сортировка вставки sortedcontainers работает в O (log n), а bisect.insort () в O (n).O(n)
Хотя я до сих пор никогда не проверял "большую" скорость базовых операций со списками Python,
bisect
стандартный модуль, вероятно, также стоит упомянуть в этом контексте:PS. Ах, извините,
bisect
упоминается в упомянутом вопросе. Тем не менее, думаю, не будет большого вреда, если эта информация будет здесь)PPS. И списки CPython на самом деле являются массивами (не, скажем, skiplists и т. Д.). Что ж, я думаю, это должно быть что-то простое, но как по мне, название немного вводит в заблуждение.
Итак, если я не ошибаюсь, скорости пополам / списку, вероятно, будут такими:
Upd. После обсуждения в комментариях позвольте мне связать здесь эти вопросы SO: Как реализован список Python и какова сложность выполнения функций списка Python
источник
источник
Хотя он (пока) не предоставляет пользовательской функции поиска,
heapq
модуль может удовлетворить ваши потребности. Он реализует очередь кучи с использованием обычного списка. Вам нужно будет написать свой собственный эффективный тест членства, который использует внутреннюю структуру очереди (это можно сделать за O (log n) , я бы сказал ...). Есть один недостаток: извлечение отсортированного списка имеет сложность O (n log n) .источник
Я бы использовал модули
biscect
илиsortedcontainers
. У меня нет опыта, но я думаю, чтоheapq
модуль работает. Он содержитHeap Queue
источник
Реализовать собственный список сортировки на Python может быть несложно. Ниже приведено подтверждение концепции:
========= Результаты ============
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 101]
[3, 10, 14, 17, 23, 44, 45, 45, 50, 66, 73, 77, 79, 84, 85, 86, 91, 95, 99, 101]
101
3
50
источник