Функції алгоритму поділу навпіл у Python

The ділимо навпіл модуль у Python надає прості та швидкі (на основі бінарного пошуку) функції для пошуку елемента у відсортованому списку, пошуку правильної позиції для вставки нових елементів і вставки нових елементів, гарантуючи, що список залишається відсортованим.

Для чого нам потрібен модуль Bisect?

  1. Корисно для операцій бінарного пошуку для пошуку в відсортованому списку та для пошуку точок вставки.
  2. Надає ефективні методи вставлення елементів у відсортований список, зберігаючи порядок.
  3. Уникає необхідності ручного сортування після кожного вставлення, заощаджуючи час і зусилля.
  4. Пропонує такі функції, як bisect() bisect_left() bisect_right() і insort() для чистого оптимізованого коду.
  5. Ідеально підходить для таких завдань, як підтримка ранжованих даних у таблицях лідерів або будь-яких сценаріїв із вставкою/пошуком сортованих даних.

Основні функції модуля 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 у цьому діапазоні, не впливаючи на решту списку.