Binäärihaku

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 20. maaliskuuta 2021 tarkistetusta versiosta . tarkastukset vaativat 29 muokkausta .

Binäärihaku ( tunnetaan myös bisektiomenetelmänä tai dikotomiana ) on klassinen algoritmi elementin löytämiseksi lajitetusta taulukosta (vektorista), joka käyttää taulukon jakamista puoliksi. Käytetään tietojenkäsittelytieteessä , laskennallisessa matematiikassa ja matemaattisessa ohjelmointissa .

Binäärihaun erikoistapaus on puolittamismenetelmä , jota käytetään tietyn jatkuvan funktion juurien etsimiseen tietyltä aikaväliltä.

Elementin etsiminen järjestetystä taulukosta

  1. Tietorakenteen keskellä olevan elementin arvon määrittäminen. Saatua arvoa verrataan avaimeen.
  2. Jos avain on pienempi kuin keskiarvo, haku suoritetaan elementtien ensimmäisellä puoliskolla, muuten - toisessa.
  3. Haku rajoittuu siihen, että valitun puolikkaan keskielementin arvo määritetään uudelleen ja sitä verrataan avaimeen.
  4. Prosessi jatkuu, kunnes joko avainarvon sisältävä elementti löytyy tai hakuväli on tyhjä.

Vaikka koodi on melko yksinkertainen, siinä on muutamia sudenkuoppia.

Tiedemies Jon Bentley väittää, että 90 % opiskelijoista unohtaa ottaa huomioon kaikki näistä vaatimuksista kehittäessään binaarihakua. Ja jopa Jonin itsensä kirjoittamassa ja kirjasta kirjaan siirtymässä koodissa sisään hiipi virhe: koodi ei kestä ylivuotoa [1] .

Java-toteutusesimerkki

int binarySearch ( int [ ] arr , int avain ) { int alhainen = 0 ; int korkea = arr . pituus - 1 ; while ( matala <= korkea ) { int mid = ( matala + korkea ) >>> 1 ; int midVal = arr [ mid ] ; jos ( midVal < avain ) matala = keski + 1 ; muu jos ( midVal > avain ) korkea = keski - 1 ; muu paluu puolivälissä ; // avain löytyi } paluu - ( alhainen + 1 ); // avainta ei löydy. }

Sovellukset

Binäärihakumenetelmän käytännön sovellukset ovat erilaisia:

Katso myös

Muistiinpanot

  1. 1 2 Extra, Extra - Lue kaikki siitä: Lähes kaikki binaarihaut ja yhdistämismuodot ovat rikki . Arkistoitu 2. joulukuuta 2013 Wayback Machinessa // Joshua Bloch, Google Research; käännös — Lähes kaikissa binäärihaun ja yhdistämislajittelun toteutuksissa on virhe . Arkistoitu 24. marraskuuta 2013 Wayback Machineen
  2. C++ : ssa etsii ensimmäisen esiintymän ja löytää seuraavan  elementin . std::lower_boundxstd::upper_boundx

Kirjallisuus

  • Levitin A. V. Luku 4. Hajotusmenetelmä: Binäärihaku // Algoritmit. Johdatus kehitykseen ja analyysiin - M .: Williams , 2006. - S. 180-183. — 576 s. — ISBN 978-5-8459-0987-9
  • Amosov A. A., Dubinsky Yu. A., Kopchenova N. P. Laskennalliset menetelmät insinööreille. - M .: Mir, 1998.
  • Bakhvalov N. S., Zhidkov N. P. , Kobelkov G. G. Numeeriset menetelmät. - 8. painos - M . : Perustiedon laboratorio, 2000.
  • Wirth N. Algoritmit + tietorakenteet = Ohjelmat . - M . : " Mir ", 1985. - S.  28 .
  • Volkov E. A. Numeeriset menetelmät. - M .: Fizmatlit, 2003.
  • Gill F., Murray W., Wright M. Käytännön optimointi. Per. englannista. - M .: Mir, 1985.
  • Kormen, T. , Leizerson, C. , Rivest, R. , Stein, K. Algoritmit: rakentaminen ja analyysi = Introduction to Algorithms / Ed. I. V. Krasikova. - 2. painos - M .: Williams, 2005. - 1296 s. — ISBN 5-8459-0857-4 .
  • Korn G., Korn T. Matematiikan käsikirja tutkijoille ja insinööreille. - M .: Nauka, 1970. - S. 575-576.
  • Korshunov Yu. M., Korshunov Yu. M. Kybernetiikan matemaattiset perusteet. - Energoatomizdat, 1972.
  • Maksimov Yu. A., Filippovskaya EA Algoritmit epälineaaristen ohjelmointiongelmien ratkaisemiseen. - M .: MEPhI, 1982.
  • Robert Sedgwick. C:n perusalgoritmit. Perusteet/Tietorakenteet/Lajittelu/Haku. - Pietari. : DiaSoftYUP, 2003. - S. 672. - ISBN 5-93772-081-4 .

Linkit