Binäärihaku
Löytää arvon järjestetystä taulukosta katsomalla keskelle ja hylkäämällä puolikkaan, jossa arvo ei voi olla. Jokainen vertailu puolittaa jäljellä olevan.
- paras Ω(1)
- keskimääräinen Θ(log n)
- huonoin O(log n)
- tila O(1)
Mitä nämä tarkoittavat?
- Järjestetty: nousevassa järjestyksessä. Binäärihaku vaatii tämän; järjestämättömällä datalla se antaa vääriä vastauksia.
- Puolittaminen: jokainen vertailu hylkää puolet jäljellä olevasta, sen puolen, jossa kohde ei voi olla.
- log₂ n: kuinka monta kertaa n voidaan puolittaa, kunnes jäljellä on 1. 64 arvolla se on 6, joten enintään 7 vertailua.
- keskikohta (mid)
- löytyi
- hylätty
- kohde
Jokainen keskikohta, jonka haku voisi valita; ajo on yksi polku alaspäin. Tasot: 5 = ⌈log₂(24 + 1)⌉, suurin tarvittava vertailujen määrä.
Etsitään 70 joukosta, jossa on 24 järjestettyä arvoa: koko taulukko on vielä mukana.
Välilyönti: toisto tai tauko. Nuolinäppäimet: askel. Home ja End: alkuun tai loppuun.
Kokeile tätä: Valitse kohde, jota ei ole taulukossa. Haku päättyy silti viimeistään ⌈log₂(n + 1)⌉ vertailun jälkeen, kun lo ohittaa hi:n.
Miten se toimii
Binäärihaku pitää kaksi merkkiä, lo ja hi, sen taulukon osan ympärillä, jossa kohde voi vielä olla. Se katsoo keskimmäistä arvoa: jos se on kohde, valmista; jos se on pienempi, kohde voi olla vain oikealla, joten lo siirtyy keskikohdan ohi; jos suurempi, hi siirtyy sen eteen. Jokainen askel puolittaa loput: 64 arvoa vaatii enintään 7 vertailua ja miljoona enintään 20. Kun lo ohittaa hi:n, mitään ei ole jäljellä: arvoa ei ole taulukossa.
Milloin se on hyvä valinta
Käytä binäärihakua aina, kun data on järjestetty ja mihin tahansa kohtaan voi hypätä: sana järjestetyssä listassa, versio julkaisuhistoriassa, git bisect, lisäyskohta järjestetyssä taulukossa. Järjestämättömällä datalla se antaa vääriä vastauksia, ja järjestäminen ensin kannattaa vain, jos haet monta kertaa.