Download as pdf or txt
Download as pdf or txt
You are on page 1of 20

Peräkkäishaku vs.

binäärihaku

Vertailujen lukumäärä

Esim. n = 50

• Peräkkäishaku: Keskimäärin n/2 = 25

• Binäärihaku: Enintään ⌊log2 n⌋ + 2 = 7.

Esim. n = 1000

• Peräkkäishaku: Keskimäärin n/2 = 500.

• Binäärihaku: Enintään ⌊log2 n⌋ + 2 = 11.

Binäärihakua voi käyttää järjestetylle aineistolle. Tehokkuuden edellytys on, että to-
teutus on tehty niin, että keskimmäinen alkio (käytännössä kaikki alkiot) on suoraan
saatavilla.
Kertausta aiemmilta kerroilta ja johdattelua linkitetyn listan käyttöön
Abstraktit tietotyypit: jono, pino, lista (järjestämätön tai järjestetty).
Käytännön toteutuksessa tietorakenteena
taulukko linkitetty lista
• keskellä olevan alkion saaminen tehokkaasti • lisäys ja poisto välistä tehokkaasti
• vaatii ennalta annetun maksimikoon, koko • muistiosoite jokaiselle seuraajalle, solmuja
rajoitettu voidaan lisätä kunnes muisti loppuu
• muistiosoite taulukon alkuun • edellyttää yleensä enemmän ohjelmakoodia,
• soveltuu binäärihakuun järjestetystä listasta osoittimet alkioihin.

(Kuva sivulta http://comscigate.com/cs/IntroSedgewick/40adt/43link/index.html)


Linkitetyt listat l. listan dynaaminen toteutus

• Listan alkiot dynaamisessa muistissa, eivät välttämättä fyysisesti vierekkäin.

• Muistitilaa varataan ja vapautetaan dynaamisesti.

• Listan kokoa rajoittaa vain muistin koko.

• Alkioita lisättäessä ja poistettaessa ei siirrellä alkioita, vaan muutetaan linkkejä.

• Jokaisessa alkiossa osoitin (linkki, viite) seuraavaan alkioon listassa, esim. next.

• Viimeisellä alkiolla ei seuraajaa, osoittimella erityinen vakioarvo null.

• Ensimmäiseen alkioon osoittaa listaosoitin (listanpää), esim. plista tai first.

• Tyhjän listan listaosoittimella arvo null.

(Vertaa toteutus taulukolla: maksimikoko määriteltävä aluksi ja alkioita joudutaan siirtämään.)


Yhteen suuntaan linkitetty lista
• Yksinkertaisin linkitetty lista.

• Viite (osoitin, referenssi) ensimmäiseen.

• Alkio/tietue ja viite seuraavaan.

• Viimeinen viite osoittaa null-arvoon.

Listan läpikäynti

for (pj = plista; pj != null; pj = pj.next) {


// Tehdään jotain pj:n osoittamalle
// alkiolle, esimerkiksi:
tulosta(pj.nimi, pj.syntvuosi);
}
Lisäys linkitettyyn listaan

• Varataan uudelle alkiolle tila dynaamisesta Esimerkki: Muodostetaan linkitetty lista (li-
sätään alkioita tyhjään listaan). Jokainen
muistista.
listan alkio on SolmuOlento-tyyppinen olio,
• Osoitin uuteen alkioon (esim. uusi). joka sisältää string-tyyppisen arvon ja refe-
• Tallennetaan tietosisältö alkion kenttiin. renssin seuraavaan alkioon.

• Lisäyksen paikka haetaan (alkion edeltäjä). SolmuOlento a = new SolmuOlento();


a.value = "A";
• Päivitetään listan seuraajaosoittimet. a.next = null;
• Jos listalla muita osoittimia (esim. osoitin SolmuOlento b = new SolmuOlento();
b.value = "B";
viimeiseen alkioon, pviim tai last), myös b.next = a;
ne päivitetään. SolmuOlento c = new SolmuOlento();
c.value = "C";
c.next = b;

···

(Ei näy osoitinta ensimmäiseen alkioon; saa olettaa,

että tässä on esitetty vain listan loppupää.)


Lisäys listan alkuun

uusi.next = plista;
plista = uusi;
Lisäys listan keskelle

uusi.next = pj.next;
pj.next = uusi;
Lisäys listan loppuun

pviim.next = uusi;
uusi.next = null;
pviim = uusi;
Poistaminen linkitetystä listasta

• Poistettava alkio ja sen edeltäjä haetaan.

• Jos poistettava on ensimmäinen alkio, edeltäjää ei ole.

• Osoitin poistettavaan alkioon (esim. pois).

• Päivitetään listan seuraajaosoittimet.

• Jos listalla muita osoittimia, päivitetään myös ne.

• Vapautetaan poistettavan alkion muistitila.


Listan alusta poistaminen

plista = pois.next;
Listan keskeltä poistaminen

pj.next = pois.next;
Linkitetty lista, jossa osoitin myös viimeiseen alkioon

• Osoitin ensimmäiseen ja viimeiseen alkioon.

• Esimerkeissä osoitin viimeiseen alkioon pviim tai last.

• Lisäyksessä loppuun ja lopusta poistoissa pitää päivittää viimeisen alkion osoitinta.


Alkutietueen käyttö (tunnussolmullinen lista)

Alkutietue

• Listan alussa oleva alkio, joka ei ole listan varsinainen alkio.

• Samaa tyyppiä kuin listan muut alkiot.

• Voi sisältää listan alkioiden yhteistä tietoa.

Yksinkertaistaa joitain listaoperaatioita.

Ensimmäisen alkion käsittely ei eroa muiden alkioiden. käsittelystä


Poisto alkutietueellisen listan alusta

pj.next = pois.next;
Rengaslista (engl. circular list)

• Viimeisen alkion seuraajaosoitin osoittaa listan ensimmäiseen alkioon.

• Ei null-osoitinta lopussa

• Rengas on käyty läpi, kun tullaan takaisin samaan alkioon kuin mistä lähdettiin.
Rengaslistassa listaosoitin voi olla myös osoitin viimeiseen alkioon.

• Lisäys sekä alkuun että loppuun olisi helppoa (ei tarvita koko listan läpikäyntiä).

• Ensimmäisen alkion poistaminen olisi helppoa.

• Viimeisen alkion poistaminen vaatisi edelleen koko listan läpikäynnin.


Kahteen suuntaan linkitetty (kaksoislinkitetty) lista
(engl. (doubly linked list))

• Jokaisesta tietueesta osoitin sekä seuraavaan että edelliseen (esim. prev) alkioon.

• Ensimmäisellä alkiolla ei edeltäjää, osoittimella vakioarvo null.

• Lisäys ja poisto mielivaltaiseen paikkaan voidaan tehdä ilman että täytyy erikseen
hakea naapurialkioita.

• Listan päät kuitenkin käsiteltävä erikoistapauksina.


Lisääminen kaksoislinkitettyyn listaan
(ks. esim. https://kalkicode.com/data-structure/doubly-linked-list-visualization)

uusi.prev = seur.prev;
uusi.next = seur;
seur.prev.next = uusi;
seur.prev = uusi;
Kaksoislinkitetty rengaslista alkutietueella

Listan päät eivät ole erikoistapauksia.

Tyhjässä listassa on alkutietue


ja osoittimet itseensä.

You might also like