Przez co rozumiem strukturę z:
- O (log n) złożoność
x.push()
operacji - O (log n) złożoność znalezienia elementu
- O (n) złożoność obliczeń,
list(x)
które zostaną posortowane
Miałem również powiązane pytanie dotyczące wydajności, list(...).insert(...)
która jest teraz tutaj .
memcpy
jest nadal operacją O (n) . Nie jestem pewien, w jaki sposób Python dokładnie implementuje listy , ale stawiam na to, że są one przechowywane w ciągłej pamięci (na pewno nie jako lista połączona). Jeśli tak jest w istocie, wstawienie,bisect
którego użyjesz, będzie miało złożoność O (n) .Odpowiedzi:
Standardowa lista Pythona nie jest sortowana w żadnej formie. Standardowy moduł heapq może być użyty do dołączenia O (log n) do istniejącej listy i usunięcia najmniejszej z O (log n), ale nie jest to posortowana lista w twojej definicji.
Istnieją różne implementacje zbalansowanych drzew dla Pythona, które spełniają twoje wymagania, np. Rbtree , RBTree lub pyavl .
źródło
Czy jest jakiś szczególny powód, dla którego masz duże wymagania? A może po prostu chcesz, żeby był szybki? Sortedcontainers moduł czystej Python i szybko (jak szybko jak -C implementacjach jak BList i rbtree).
Do wykonania porównania pokazuje, że poziomy odniesienia szybciej lub na równi z BLIST jest posortowana lista typu. Zauważ również, że rbtree, RBTree i PyAVL zapewniają posortowane dyktowanie i typy zestawów, ale nie mają posortowanego typu listy.
Jeśli wymagana jest wydajność, zawsze pamiętaj o testach porównawczych. Moduł, który uzasadnia twierdzenie, że jest szybki w notacji Big-O, powinien być podejrzany, dopóki nie pokaże również porównań wzorców.
Zastrzeżenie: jestem autorem modułu sortcontainers w języku Python.
Instalacja:
Stosowanie:
źródło
0.0845024989976
dla SortedList.add () vs0.596589182518
dla bisect.insort (), stąd różnica w szybkości 7x! I spodziewam się, że różnica prędkości wzrośnie wraz z długością listy, ponieważ sortowanie przez wstawianie sortcontainers działa w O (log n), podczas gdy bisect.insort () w O (n).O(n)
Chociaż nadal nigdy nie sprawdzałem szybkości "dużych O" podstawowych operacji na listach Pythona,
bisect
prawdopodobnie warto wspomnieć w tym kontekście o module standardowym:PS. Ach, przepraszam,
bisect
jest mowa w przywoływanym pytaniu. Mimo to myślę, że nie zaszkodzi, jeśli te informacje będą tutaj)PPS. A listy CPythona są w rzeczywistości tablicami (nie powiedzmy listami przeskoków itp.). Cóż, myślę, że muszą to być coś prostego, ale jak dla mnie nazwa jest trochę myląca.
Tak więc, jeśli się nie mylę, prędkości w połowie / listy prawdopodobnie byłyby:
Upd. Po dyskusji w komentarzach pozwólcie mi połączyć tutaj następujące pytania SO: W jaki sposób jest implementowana lista Pythona i jaka jest złożoność funkcji list Pythona w czasie wykonywania
źródło
źródło
Chociaż nie zapewnia (jeszcze) niestandardowej funkcji wyszukiwania,
heapq
moduł może odpowiadać Twoim potrzebom. Implementuje kolejkę sterty przy użyciu zwykłej listy. Musiałbyś napisać swój własny skuteczny test członkostwa, który wykorzystuje wewnętrzną strukturę kolejki (można to zrobić w O (log n) , powiedziałbym ...). Jest jedna wada: wyodrębnianie posortowanej listy ma złożoność O (n log n) .źródło
Użyłbym modułów
biscect
lubsortedcontainers
. Nie mam doświadczenia, ale myślę, żeheapq
moduł działa. Zawiera plikHeap Queue
źródło
Zaimplementowanie własnej listy sortowania w Pythonie może nie być trudne. Poniżej znajduje się dowód słuszności koncepcji:
========= Wyniki ============
[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
źródło