Close menu
Close menu

Tunnistaudu

Kirjaudu

Etkö ole vielä jäsen?

Liity jäseneksi

5.5 Vektorit ja puolitushaku

Vektorit

Listan alkiot on linkitetty toisiinsa siten, että edellisestä alkiosta on aina linkki seuraavaan alkioon (kts. 1. Listat ja tilastomatematiikkaa). Listan indeksissä i sijaitseva alkio etsitään käymällä listaa läpi lähtien liikkeelle listan alusta. Alkion haku listan ”loppupäästä” vie siis enemmän aikaa kuin alkion haku listan alusta.

Vektori (engl. vector) on Racketista valmiina löytyvä tietorakenne. Vektori on taulukko, joka on toteutettu siten, että indeksissä i sijaitseva alkio on aina mahdollista hakea vakioajassa.
Slide30.PNG
Alkion haun nopeutta vektorista ja listasta voi vertailla luomalla ensin listan ja vektorin, joissa molemmissa on miljoona alkiota. Haettaessa esimerkiksi alkiota indeksistä 666666, näkyy hakujen nopeusero jo selvästi. Listan ja vektorin ollessa lyhyitä ei hakujen nopeuserolla yleensä ole käytännön merkitystä.
Slide31.PNG
Lisätietoa vektoreista löytyy Racketin englanninkielisestä oppaasta.

Puolitushaku

Puolitushaku on tehokas ja yleisesti käytetty hakualgoritmi järjestetylle taulukolle. Tarkastellaan taulukkoa, jonka alkiot on järjestetty pienimmästä suurimpaan. Tavoitteena on tutkia, löytyykö jokin määrätty alkio taulukosta. Puolitushaussa ideana on lähteä etsimään alkiota taulukon keskeltä. Koska taulukko on järjestetty, tiedetään että kaikki alkiot taulukon alkupäässä ovat pienempiä kuin taulukon keskimmäinen alkio. Vastaavasti tiedetään, että taulukon loppupäässä olevat alkiot ovat suurempia kuin taulukon keskimmäinen alkio.
Slide31.PNG
Puolitushakua voi kokeilla myös parin kanssa. Pyydä pariasi ajattelemaan jotain lukua väliltä 0-100. Parisi kysyy, ”Mitä lukua ajattelen?”. Voit kysyä esimerkiksi, ”Ajatteletko lukua 1?”. Parisi vastaa joko ”Kyllä, arvasit oikein!”, ”En, lukuni on suurempi” tai ”En, lukuni on pienempi”. Kokeile ”Mitä lukua ajattelen” peliä parisi kanssa. Miten voit löytää parisi ajatteleman luvun nopeasti käyttämällä puolitushakua?

Linkki ”Mitä lukua ajattelen?” -ohjelmaan (WeScheme).
Slide32.PNG
Puolitushakua voi soveltaa myös aakkosjärjestyksessä olevaan taulukkoon merkkijonoja.

Edellä todettiin, että puolitushaku on tehokas hakualgoritmi. Tarkastellaan taulukkoa, jossa on n-kappaletta alkioita. Jos alkiota etsitään taulukosta käymällä läpi kaikki taulukon alkiot, voidaan joutua tekemään n kappaletta vertailuja (etsittävää alkiota verrataan jokaiseen taulukon alkioon). Puolitushaussa joudutaan tekemään vertailuja vain noin log n kertaa. Lisätietoa puolitushausta löytyy esimerkiksi wikipediasta.

Tehtäväsarja 1: Puolitushaun toteuttaminen