11.07.2015 Views

2014.1.futuro

2014.1.futuro

2014.1.futuro

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

KoodiMaailman vaikein algoritmiMoni koodari on yrittänyt toteuttaa binäärihaun, mutta tuskin kukaan on onnistunutsiinä. Tämän jutun luettuasi voit liittyä harvojen ja valittujen joukkoon.Teksti: Antti Laaksonen Kuva: Mitol BerschewskyBinäärihaku on ohjelmoinnin teoriantunnetuimpia algoritmeja. Sen tehokkaammin, jos taulukon alkiot voivatTarkistusta ei voi tehdä lineaarihakuaavulla voi esimerkiksi tarkistaa olla sekaisin. Tällöin etsittävä alkio voitehokkaasti, esiintyykö annettu luku järjestetyssätaulukossa. Toisaalta binäärihakuon tullut tunnetuksi myös siitä, ettäalgoritmin toteuttaminen virheettömästion lähestulkoon mahdotonta. Näin asiaonkin, jos algoritmin toteuttaa perinteiselläolla missä tahansa taulukon kohdassa,ja algoritmin täytyy pahimmassa tapauksessakäydä läpi kaikki alkiot. Tilannekuitenkin muuttuu, jos taulukon sisältöon järjestetty. Tällöin binäärihaku on ylivertaisentehokas algoritmi etsimiseen.menetelmällä. Toteuttaminen muut-Perinteinen binäärihakuun liittyvätuu kuitenkin lastenleikiksi, kun valitaantoisenlainen lähestymistapa.vertauskuva on nimen etsiminen puhelinluettelosta.Aluksi puhelinluetteloavataan keskeltä ja katsotaan, mikä nimiBinäärihaulla olisit jo perilläOletetaan, että taulukko T sisältää n lukuaja että tehtävänä on tarkistaa, esiintyyköluku k taulukossa. Yksinkertaisinalgoritmi tähän tehtävään on lineaarihaku,joka käy läpi taulukon luvut yksikerrallaan. C-sukuisella kielellä lineaarihaunvoisi toteuttaa seuraavasti:for (int i = 0; i < n; i++)if (T[i] == k)return true;return false;siinä kohdassa on. Nyt haun voi rajoittaaluettelon alkuosaan tai loppuosaan riippuensiitä, mikä nimi on luettelon keskellä.Hakualuetta puolitetaan tällä tavallayhä uudestaan, kunnes alue on niin pieni,että nimi löytyy helposti. Idea on hauska,mutta ikävä kyllä binäärihaun koodaaminenbugittomasti on tämän pohjalta vaikeaa.Helpompi lähestymistapa on ajatellabinäärihakua lineaarihaun tehostuksena.Ideana on siirtyä taulukossa eteenpäinhyppäyksin. Ensin hypyn pituus on n/2indeksiä, sitten n/4 indeksiä, sitten n/8indeksiä jne. Haun alussa voidaan tehdäpitkiä loikkia, mutta vauhti hidastuu, kuntullaan lähemmäksi etsittävää lukua. Tuloksenaon seuraava koodi:int i = 0;for (int b = n / 2; b >= 1; b /= 2)while (i + b < n && T[i + b]

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!