Modul bisect
poskytuje v zásadě dvě skupiny funkcí:
O(log n)
);
O(n)
).
Jeho principielním prvním použitím je tedy postupné vytváření utříděných seznamů z jednotlivých postupně vkládaných prvků, aniž by se musel seznam po každém novém vložení znovu třídit.
Ukažme si rovnou srovnávací příklad:
random.seed(1)
je použit proto, aby každý z vytvářených seznamů dostával postupně stejnou sekvenci vkládaných čísel. (PyMOTW – bisect)
Vidíme, že už i pro takto krátký seznam je vkládání prvků rovnou na správnou pozici pomocí modulu bisect řádově rychlejší, než snaha třídit seznam po každém vložení.
Na druhou stranu pokud potřebujete utříděný seznam až na konci, pro takto malá data bude rychlejší ho také setřídit až na konci, jak ukazuje následující kus kódu:
Tato skupina funkcí vrací pro daný prvek pozici v (utříděném) seznamu, na kterou patří zařadit:
bisect_left(xs, x)
– najde v seznamu xs takovou pozici, že všechny prvky nalevo od ní jsou menší než x a všechny prvky napravo od ní jsou buď stejné nebo větší;
bisect_right(xs, x)
, případně jen bisect(xs, x)
– to samé jako předchozí, ale obsahuje-li seznam stejné prvky jako prvek vkládaný, bude vrácena první pozice vpravo od nich.
[0, len(xs)]
.
Stručně řečeno první funkce vrátí index nejlevějšího výskytu stejného prvku, druhé dvě nejpravějšího plus jedna:
Tato dvojce (resp. trojce) funkcí stejně jako předchozí najde místo pro vložení prvku, ale zároveň na toto místo v seznamu tento prvek i rovnou vloží:
insort_left(xs, x)
– najde v seznamu xs takovou pozici, že všechny prvky nalevo od ní jsou menší než x a všechny prvky napravo od ní jsou buď stejné nebo větší, a na tuto pozici prvek x vloží;
insort_right(xs, x)
, případně jen insort(xs, x)
– to samé jako předchozí, ale obsahuje-li seznam stejné prvky jako prvek vkládaný, bude tento prvek vložen na první pozici vpravo od nich.
[0, len(xs)]
.
Výsledný seznam tedy bude vypadat stejně, ale místa vložení se budou lišit.
Navzdory dokumentaci insertovací funkce vesele operují i nad nesetříděným seznamem – prostě hledají první, resp. poslední místa výskytu příslušného prvku. Což vzhledem k tomu, že seznam sám nemá funkci pro hledání posledního (resp. prvního od konce) výskytu, se může občas i docela hodit. Ostatně na prohledávání seznamů je v oficální dokumentaci rozpracována celá podsekce příkladů.
Další skupinu použití představuje vyhledávání ve srovnatelných (např. číselných) polích, jak ukazuje třeba následujcí příklad pro dohledání známky k příslušnému bodovému ohodnocení (bez invence obšlehnutý z dokumentace):