Функції алгоритму поділу навпіл у Python
The ділимо навпіл модуль у Python надає прості та швидкі (на основі бінарного пошуку) функції для пошуку елемента у відсортованому списку, пошуку правильної позиції для вставки нових елементів і вставки нових елементів, гарантуючи, що список залишається відсортованим.
Для чого нам потрібен модуль Bisect?
- Корисно для операцій бінарного пошуку для пошуку в відсортованому списку та для пошуку точок вставки.
- Надає ефективні методи вставлення елементів у відсортований список, зберігаючи порядок.
- Уникає необхідності ручного сортування після кожного вставлення, заощаджуючи час і зусилля.
- Пропонує такі функції, як bisect() bisect_left() bisect_right() і insort() для чистого оптимізованого коду.
- Ідеально підходить для таких завдань, як підтримка ранжованих даних у таблицях лідерів або будь-яких сценаріїв із вставкою/пошуком сортованих даних.
Основні функції модуля Bisect
Модуль bisect в основному пропонує два типи функцій:
- Пошук точки вставки (без вставки)
- Вставлення елементів у правильне положення
1. Пошук точок вставки
Ці функції повертають індекс, куди слід вставити новий елемент, щоб зберегти список упорядкованим.
a) bisect.bisect(): Повертає крайню праву точку вставки для елемента. Якщо елемент уже існує, точка вставки буде після існуючих записів.
bisect.bisect(list num beg=0 end=len(list))
Параметр:
- список: Відсортований список.
- номер: Елемент для вставки.
- просити: Початковий індекс для пошуку (необов'язково).
- кінець: Кінцевий індекс для пошуку (необов'язково).
b) bisect.bisect_left(): Повертає крайню ліву точку вставки для елемента. Якщо елемент існує, точка вставки буде перед існуючими записами.
bisect.bisect_left(list num beg=0 end=len(list))
c) bisect.bisect_right(): Ідентично bisect.bisect() повертає крайню праву точку вставки.
bisect.bisect_right(list num beg=0 end=len(list))
приклад: Знайдіть індекси вставки для значення 4 у відсортованому списку за допомогою різних функцій розділення навпіл.
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
Вихід
5 2 4
Пояснення:
- розділити навпіл (li 4): Повертає 5, оскільки знаходить крайню праву позицію після останніх 4 у списку (індекс 4), тому точка вставки дорівнює 5.
- bisect_left(li 4): Повертає 2, оскільки знаходить крайню ліву позицію перед першими 4 у списку (індекс 2).
- bisect_right(li 4 0 4): Працює лише з підсписком що[0:4] і повертає 4, оскільки вставляє 4 після останніх 4 у підсписку.
2. Вставлення елементів
Ці функції вставляють елемент у правильне положення для підтримки сортування.
a) bisect.insort(): Вставляє елемент у крайню праву позицію. На відміну від функцій bisect(), це фактично змінює список, вставляючи елемент.
bisect.insort(list num beg=0 end=len(list))
Параметр:
- список: Відсортований список.
- номер: Елемент для вставки.
- благати (необов'язково): Початковий індекс для вставки (за замовчуванням 0).
- кінець (необов'язково): Кінцевий індекс для вставки (за замовчуванням len(list)).
b) bisect.insort_left(): Вставляє елемент у крайню ліву позицію.
bisect.insort_left(list num beg=0 end=len(list))
c) bisect.insort_right(): Вставляє елемент у крайню праву позицію (подібно до insort()).
bisect.insort_right(list num beg=0 end=len(list))
приклад: Вставте значення 5 у відсортований список, зберігаючи його відсортованим за допомогою різних стратегій вставки.
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 )
Вихід
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
Пояснення:
- виникають (l1 5) вставляє 5 у найзручніше місце справа – після всіх 4 і перед 6.
- insort_left(l2 5) вставляє 5 у найзручнішу позицію зліва – те саме, що і вставка тут, оскільки 5 немає у списку.
- insort_right(l3 5 0 4) вставляє 5 в індексі 4, працюючи лише з підсписком l3[0:4] = [1 3 4 4] після останнього ≤ 5 у цьому діапазоні, не впливаючи на решту списку.