The разполовявам модул в Python предоставя прости и бързи (базирани на двоично търсене) функции за търсене на елемент в сортиран списък, намиране на правилната позиция за вмъкване на нови елементи и вмъкване на нови елементи, като се гарантира, че списъкът остава сортиран.
Защо се нуждаем от Bisect модул?
- Полезно за операции за двоично търсене за търсене в сортиран списък и за намиране на точки за вмъкване.
- Предоставя ефективни методи за вмъкване на елементи в сортиран списък, като същевременно поддържа ред.
- Избягва необходимостта от ръчно сортиране след всяко поставяне, спестявайки време и усилия.
- Предлага функции като bisect() bisect_left() bisect_right() и insort() за чист оптимизиран код.
- Идеален за задачи като поддържане на класирани данни в класации или всеки сценарий, включващ вмъкване/търсене на сортирани данни.
Основни функции на Bisect модул
Модулът bisect предлага основно два вида функционалности:
- Намиране на точката на вмъкване (без вмъкване)
- Вмъкване на елементи в правилната позиция
1. Намиране на точки на вмъкване
Тези функции връщат индекса, където трябва да бъде вмъкнат новият елемент, за да поддържа списъка сортиран.
a) bisect.bisect(): Връща най-дясната точка на вмъкване за елемента. Ако елементът вече съществува, точката на вмъкване ще бъде след съществуващите записи.
bisect.bisect(list num beg=0 end=len(list))
Параметър:
- списък: Сортиран списък.
- номер: Елемент за вмъкване.
- моля: Стартов индекс за търсене (по избор).
- край: Краен индекс за търсене (по избор).
б) bisect.bisect_left(): Връща най-лявата точка на вмъкване за елемента. Ако елементът съществува, точката на вмъкване ще бъде преди съществуващите записи.
xor в c++
bisect.bisect_left(списък num beg=0 край=len(списък))
в) bisect.bisect_right(): Идентичен на bisect.bisect() връща най-дясната точка на вмъкване.
bisect.bisect_right(списък num beg=0 край=len(списък))
Пример: Намерете индекси за вмъкване за стойност 4 в сортиран списък, като използвате различни функции за разполовяване.
Pythonimport 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. Вмъкване на елементи
Тези функции вмъкват елемента на правилната позиция, за да поддържат сортирането.
а) bisect.insort(): Вмъква елемента в най-дясната позиция. За разлика от функциите bisect(), това всъщност променя списъка чрез вмъкване на елемента.
bisect.insort(списък num beg=0 край=len(списък))
Параметър:
- списък: Сортиран списък.
- номер: Елемент за вмъкване.
- моля (по избор): Начален индекс за вмъкване (по подразбиране 0).
- край (по избор): Краен индекс за вмъкване (по подразбиране len(списък)).
б) bisect.insort_left(): Вмъква елемента в най-лявата позиция.
bisect.insort_left(списък номер бег=0 край=лен(списък))
в) bisect.insort_right(): Вмъква елемента в най-дясната позиция (подобно на insort()).
java concat низове
bisect.insort_right(списък num beg=0 край=len(списък))
Пример: Вмъкнете стойност 5 в сортиран списък, като същевременно я запазите сортирана, като използвате различни стратегии за вмъкване.
Pythonimport 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 в най-лявата подходяща позиция – същото като insort тук, тъй като 5 не е в списъка.
- insort_right(l3 5 0 4) вмъква 5 в индекс 4, като работи само върху подсписък l3[0:4] = [1 3 4 4] след последното ≤ 5 в този диапазон, без да засяга останалата част от списъка.