Bisect algoritmo funkcijos Python

The padalinti į pusę „Python“ modulis teikia paprastas ir greitas (dvejetainės paieškos pagrindu) funkcijas, skirtas ieškoti elemento surūšiuotame sąraše, rasti tinkamą vietą naujiems elementams įterpti ir įterpti naujus elementus, užtikrinant, kad sąrašas liktų rūšiuotas.

Kodėl mums reikia Bisect modulio?

  1. Naudinga dvejetainėms paieškos operacijoms, ieškant surūšiuotame sąraše ir ieškant įterpimo taškų.
  2. Pateikiami veiksmingi metodai elementams įterpti į surūšiuotą sąrašą išlaikant tvarką.
  3. Sutaupoma laiko ir pastangų, todėl po kiekvieno įdėjimo nereikia rūšiuoti rankiniu būdu.
  4. Siūlo tokias funkcijas kaip bisect() bisect_left() bisect_right() ir insort(), kad kodas būtų švarus.
  5. Idealiai tinka tokioms užduotims kaip pirmaujančiųjų sąrašo duomenų tvarkymas arba bet koks scenarijus, susijęs su rūšiuotų duomenų įterpimu / paieška.

Pagrindinės Bisect modulio funkcijos

Bisect modulis daugiausia siūlo dviejų tipų funkcijas:

  • Įterpimo taško radimas (be įterpimo)
  • Elementų įdėjimas į teisingą padėtį

1. Įterpimo taškų radimas

Šios funkcijos grąžina indeksą, kuriame turėtų būti įterptas naujas elementas, kad sąrašas būtų rūšiuojamas.

a) bisect.biect(): Grąžina labiausiai dešinėje esantį elemento įterpimo tašką. Jei elementas jau egzistuoja, įterpimo taškas bus po esamų įrašų.

bisect.bisect(sąrašo skaičius beg=0 pabaiga=len(sąrašas))

Parametras:

  • sąrašas: Surūšiuotas sąrašas.
  • skaičius: Įterpiamas elementas.
  • elgetauti: Pradėti paieškos rodyklę (neprivaloma).
  • pabaiga: Paieškos pabaigos indeksas (neprivaloma).

b) bisect.bisect_left(): Grąžina kairėje esantį elemento įterpimo tašką. Jei elementas egzistuoja, įterpimo taškas bus prieš esamus įrašus.

bisect.bisect_left(sąrašo skaičius beg=0 end=len(sąrašas))

c) bisect.bisect_right(): Identiškas bisect.bisect() grąžina dešiniausią įterpimo tašką.

bisect.bisect_right(sąrašo skaičius beg=0 end=len(sąrašas))

Pavyzdys: Raskite 4 reikšmės įterpimo indeksus surūšiuotame sąraše, naudodami skirtingas pusiausvyros funkcijas.

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   

Išvestis
5 2 4  

Paaiškinimas:

  • padalinti į pusę (li 4): Grąžina 5, nes randa labiausiai dešinę vietą po paskutinių 4 sąrašo (4 rodyklė), todėl įterpimo taškas yra 5.
  • bisect_left(li 4): Grąžina 2, nes randa kairiausią poziciją prieš pirmuosius 4 sąraše (2 rodyklė).
  • bisect_right(li 4 0 4): Veikia tik antriniame sąraše kad[0:4] ir grąžina 4, nes po paskutinių 4 posąraše įterpia 4.

2. Elementų įterpimas

Šios funkcijos įterpia elementą į tinkamą vietą, kad būtų galima išlaikyti rūšiavimą.

a) Bisect.insort(): Įterpia elementą pačioje dešinėje pusėje. Skirtingai nuo bisect() funkcijų, tai iš tikrųjų pakeičia sąrašą įterpdama elementą.

bisect.insort(sąrašo skaičius beg=0 end=len(sąrašas))

Parametras:

  • sąrašas: Surūšiuotas sąrašas.
  • skaičius: Įterpiamas elementas.
  • maldauti (neprivaloma): Pradėti įterpimo indeksą (numatytasis 0).
  • pabaiga (neprivaloma): Įterpimo pabaigos indeksas (numatytasis len(sąrašas)).

b) bisect.insort_left(): Įterpia elementą pačioje kairėje pusėje.

bisect.insort_left(sąrašo skaičius beg=0 end=len(sąrašas))

c) bisect.insort_right(): Įterpia elementą pačioje dešinėje pusėje (panašiai kaip insort()).

bisect.insort_right(sąrašo skaičius beg=0 end=len(sąrašas))

Pavyzdys: Įveskite 5 reikšmę į surūšiuotą sąrašą ir išsaugokite ją surūšiuotą naudodami skirtingas įterpimo strategijas.

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  )   

Išvestis
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]  

Paaiškinimas:

  • kilti (l1 5) įdeda 5 į tinkamiausią dešinę padėtį – po visų 4 s ir prieš 6.
  • insort_left (l2 5) įterpia 5 kairėje tinkamiausioje vietoje – kaip ir čia, nes 5 sąraše nėra.
  • insort_right(l3 5 0 4) įterpia 5 į 4 indeksą, veikiantį tik posąraše l3[0:4] = [1 3 4 4] po paskutinių ≤ 5 tame diapazone, nepaveikdamas likusios sąrašo dalies.