Funkcje algorytmu Bisect w Pythonie
The przepoławiać moduł w Pythonie zapewnia proste i szybkie (oparte na wyszukiwaniu binarnym) funkcje przeszukiwania elementu na posortowanej liście znajdowanie właściwej pozycji do wstawiania nowych elementów i wstawianie nowych elementów, zapewniając, że lista pozostanie posortowana.
Dlaczego potrzebujemy modułu Bisect?
- Przydatne w przypadku operacji wyszukiwania binarnego w celu przeszukiwania posortowanej listy i lokalizowania punktów wstawiania.
- Zapewnia wydajne metody wstawiania elementów do posortowanej listy przy zachowaniu porządku.
- Eliminuje potrzebę ręcznego sortowania po każdym włożeniu, oszczędzając czas i wysiłek.
- Oferuje funkcje takie jak bisect() bisect_left() bisect_right() i insort() w celu uzyskania czystego, zoptymalizowanego kodu.
- Idealny do zadań takich jak utrzymywanie danych rankingowych w rankingach lub w dowolnym scenariuszu obejmującym wstawianie/wyszukiwanie posortowanych danych.
Podstawowe funkcje modułu Bisect
Moduł bisekt oferuje głównie dwa rodzaje funkcjonalności:
- Znajdowanie punktu wstawienia (bez wstawiania)
- Wstawianie elementów we właściwym miejscu
1. Znajdowanie punktów wstawienia
Funkcje te zwracają indeks, w którym należy wstawić nowy element, aby lista była posortowana.
a) bisect.bisect(): Zwraca skrajny na prawo punkt wstawienia elementu. Jeżeli element już istnieje, punkt wstawienia będzie znajdował się po istniejących wpisach.
bisect.bisect(lista num beg=0 end=len(lista))
Parametr:
- lista: Posortowana lista.
- liczba: Element do wstawienia.
- błagać: Rozpocznij indeks wyszukiwania (opcjonalnie).
- koniec: Zakończ indeks wyszukiwania (opcjonalnie).
b) bisect.bisect_left(): Zwraca skrajny lewy punkt wstawienia elementu. Jeśli element istnieje, punkt wstawiania będzie znajdował się przed istniejącymi wpisami.
bisect.bisect_left(list num beg=0 end=len(lista))
c) bisect.bisect_right(): Identycznie jak bisect.bisect() zwraca punkt wstawiania skrajnie na prawo.
bisect.bisect_right(list num beg=0 end=len(lista))
Przykład: Znajdź indeksy wstawienia dla wartości 4 na posortowanej liście, używając różnych funkcji dwusiecznych.
Python import bisect li = [ 1 3 4 4 4 6 7 ] print ( bisect . bisect ( li 4 )) # right print ( bisect . bisect_left ( li 4 )) # left print ( bisect . bisect_right ( li 4 0 4 )) # subright
Wyjście
5 2 4
Wyjaśnienie:
- przepoławiać(li 4): Zwraca liczbę 5, ponieważ znajduje pozycję znajdującą się najbardziej na prawo po ostatnich 4 na liście (indeks 4), zatem punktem wstawiania jest liczba 5.
- bisect_left(li 4): Zwraca 2, ponieważ znajduje skrajną lewą pozycję przed pierwszymi 4 na liście (indeks 2).
- bisect_right(li 4 0 4): Działa tylko na podliście to[0:4] i zwraca 4, ponieważ wstawia 4 po ostatnich 4 na podliście.
2. Wstawianie elementów
Funkcje te wstawiają element we właściwej pozycji, aby zachować sortowanie.
a) bisect.insort(): Wstawia element w skrajnej prawej pozycji. W przeciwieństwie do funkcji bisect() faktycznie modyfikuje ona listę poprzez wstawienie elementu.
bisect.insort(list num beg=0 end=len(lista))
Parametr:
- lista: Posortowana lista.
- liczba: Element do wstawienia.
- błagać (opcjonalnie): Indeks początkowy do wstawienia (domyślnie 0).
- koniec (opcjonalnie): Końcowy indeks do wstawienia (domyślnie len(list)).
b) bisect.insort_left(): Wstawia element w skrajnej lewej pozycji.
bisect.insort_left(list num beg=0 end=len(lista))
c) bisect.insort_right(): Wstawia element w skrajnej prawej pozycji (podobnie jak insort()).
bisect.insort_right(list num beg=0 end=len(lista))
Przykład: Wstaw wartość 5 do posortowanej listy, utrzymując ją posortowaną przy użyciu różnych strategii wstawiania.
Python import bisect l1 = [ 1 3 4 4 4 6 7 ] l2 = [ 1 3 4 4 4 6 7 ] l3 = [ 1 3 4 4 4 6 7 ] bisect . insort ( l1 5 ) # right print ( l1 ) bisect . insort_left ( l2 5 ) # left print ( l2 ) bisect . insort_right ( l3 5 0 4 ) # subright print ( l3 )
Wyjście
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
Wyjaśnienie:
- powstać (l1 5) wstawia 5 w najbardziej odpowiednim miejscu na prawo – po wszystkich 4 i przed 6.
- insort_left(l2 5) wstawia 5 w najbardziej lewej odpowiedniej pozycji – tak samo jak w przypadku insort, ponieważ 5 nie ma na liście.
- insort_right(l3 5 0 4) wstawia 5 w indeksie 4, działając tylko na podliście l3[0:4] = [1 3 4 4] po ostatnich ≤ 5 w tym zakresie bez wpływu na resztę listy.