Bisect-algoritmifunktiot Pythonissa

The puolittaa Pythonin moduuli tarjoaa yksinkertaisia ​​ja nopeita (binäärihakuun perustuvia) toimintoja, joilla etsitään elementtiä lajiteltusta luettelosta löytää oikea paikka uusien elementtien lisäämiseksi ja uusien elementtien lisääminen varmistaakseen, että luettelo pysyy lajiteltuna.

Miksi tarvitsemme Bisect-moduulin?

  1. Hyödyllinen binäärihakuoperaatioissa, kun haluat etsiä lajiteltua luetteloa ja etsiä lisäyspisteitä.
  2. Tarjoaa tehokkaita tapoja lisätä elementtejä lajiteltuun luetteloon säilyttäen järjestyksen.
  3. Välttää manuaalisen lajittelun jokaisen lisäyksen jälkeen, mikä säästää aikaa ja vaivaa.
  4. Tarjoaa toimintoja, kuten bisect() bisect_left() bisect_right() ja insort() puhdasta optimoitua koodia varten.
  5. Ihanteellinen tehtäviin, kuten tulostaulukoiden paremmuusjärjestetyn datan ylläpitämiseen tai kaikkiin skenaarioihin, joihin liittyy lajiteltujen tietojen lisäys/haku.

Bisect-moduulin ydintoiminnot

Bisect-moduuli tarjoaa pääasiassa kahdenlaisia ​​toimintoja:

  • Lisäyskohdan etsiminen (ilman lisäystä)
  • Elementtien asettaminen oikeaan kohtaan

1. Lisäyspisteiden löytäminen

Nämä funktiot palauttavat indeksin, johon uusi elementti tulee lisätä, jotta luettelo pysyy lajiteltuna.

a) bisect.biect(): Palauttaa elementin oikeanpuoleisimman lisäyskohdan. Jos elementti on jo olemassa, lisäyskohta on olemassa olevien merkintöjen jälkeen.

bisect.biect(list num beg=0 end=len(list))

Parametri:

  • lista: Lajiteltu luettelo.
  • numero: Lisättävä elementti.
  • kerjätä: Aloita haun hakemisto (valinnainen).
  • loppu: Haun loppuhakemisto (valinnainen).

b) bisect.bisect_left(): Palauttaa elementin vasemmanpuoleisimman lisäyskohdan. Jos elementti on olemassa, lisäyskohta on ennen olemassa olevia merkintöjä.

bisect.bisect_left(list num beg=0 end=len(list))

c) bisect.bisect_right(): Sama kuin bisect.bisect() palauttaa oikeanpuoleisimman lisäyskohdan.

bisect.bisect_right(list num beg=0 end=len(list))

Esimerkki: Etsi lisäysindeksit arvolle 4 järjestetyssä luettelossa käyttämällä erilaisia ​​puolitusfunktioita.

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   

Lähtö
5 2 4  

Selitys:

  • puolittaa (li 4): Palauttaa arvon 5, koska se löytää oikeanpuoleisimman kohdan viimeisen 4:n jälkeen luettelosta (indeksi 4), joten lisäyskohta on 5.
  • bisect_left(li 4): Palauttaa 2, koska se löytää vasemmanpuoleisimman sijainnin ennen neljää ensimmäistä luettelosta (indeksi 2).
  • bisect_right(li 4 0 4): Toimii vain aliluettelossa että[0:4] ja palauttaa 4:n, koska se lisää 4:n aliluettelon viimeisen 4:n jälkeen.

2. Elementtien lisääminen

Nämä toiminnot lisäävät elementin oikeaan kohtaan lajittelun ylläpitämiseksi.

a) bisect.insort(): Lisää elementin oikeanpuoleisimpaan kohtaan. Toisin kuin bisect()-funktiot, tämä itse asiassa muuttaa listaa lisäämällä elementin.

bisect.insort(list num beg=0 end=len(list))

Parametri:

  • lista: Lajiteltu luettelo.
  • numero: Lisättävä elementti.
  • kerjää (valinnainen): Aloitusindeksi lisäystä varten (oletus 0).
  • loppu (valinnainen): Lisäyksen loppuindeksi (oletus len(list)).

b) bisect.insort_left(): Lisää elementin vasemmanpuoleisimpaan kohtaan.

bisect.insort_left(list num beg=0 end=len(list))

c) bisect.insort_right(): Lisää elementin oikeanpuoleisimpaan kohtaan (samanlainen kuin insort()).

bisect.insort_right(list num beg=0 end=len(list))

Esimerkki: Lisää arvo 5 lajiteltuun luetteloon pitäen se lajiteltuna käyttämällä erilaisia ​​lisäysstrategioita.

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  )   

Lähtö
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]  

Selitys:

  • nousta (l1 5) lisää 5 oikeaan sopivimpaan kohtaan – kaikkien 4 s jälkeen ja ennen 6:ta.
  • insort_left(l2 ​​5) lisää numeron 5 vasemmanpuoleisimpaan sopivaan kohtaan – sama kuin lisää tässä, koska 5 ei ole luettelossa.
  • insort_right(l3 5 0 4) lisää 5:n indeksiin 4, joka toimii vain alilistalla l3[0:4] = [1 3 4 4] viimeisen ≤ 5:n jälkeen kyseisellä alueella vaikuttamatta muuhun luetteloon.