Viimeksi käsiteltiin pino: lisäys ja poisto lopusta jono: lisäys loppuun, poisto alusta Pinon ja jonon yleistävä tietorakenne: kaksiloppuinen jono alkion lisäys/poisto voidaan kohdistaa jonon alkuun tai loppuun Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen alkio2 alkio3 alkio2 PushFront(alkio2) PushFront(alkio3) muita nimityksiä mm. InsertFront, AppendLeft Tietorakenteet, syksy 2007 1 Tietorakenteet, syksy 2007 2 Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushBack(x): lisää tietoalkion x jonon perään alkio2 PushBack(alkio2) PushBack(alkio3) vastaa pinon Push(x)- ja tavallisen jonon Enqueue(x)-metodia muita nimityksiä mm. InsertLast, Append Tietorakenteet, syksy 2007 3 Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PopFront(): palauttaa ensimmäisen alkion (ja poistaa sen jonosta) alkio2 alkio3 alkio3 tapahtuu virhe, jos jono on tyhjä PopFront() PopFront() tavallisen jonon vastine: Dequeue() Tietorakenteet, syksy 2007 4
Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PopBack(): palauttaa viimeisen alkion (ja poistaa sen jonosta) alkio2 tapahtuu virhe, jos jono on tyhjä vastaa pinon Pop()-metodia PopBack() PopBack() Vastaavat apumetodit IsEmpty(): palauttaa arvon true, jos jono D tyhjä, ja muuten arvon false Front(): palauttaa jonon ensimmäisen alkion poistamatta sitä jonosta tapahtuu virhe, jos D on tyhjä IsEmpty() palauttaa false Front() palauttaa alkion 1, ei poista Tietorakenteet, syksy 2007 5 Tietorakenteet, syksy 2007 6 Back(): palauttaa jonon viimeisen alkion poistamatta sitä jonosta tapahtuu virhe, jos D on tyhjä vastaa pinon Top()-metodia Size(): palauttaa kokonaislukuarvon, joka kertoo kuinka monta alkiota jonossa D on Back() palauttaa alkion 3, ei poista Size() palauttaa lukumäärän 3 Tietorakenteet, syksy 2007 7 Kaksiloppuisen jonon taulukkototeutus Kaksiloppuinen jono taulukossa: esimerkiksi jonon taulukkototeutusta matkien kokoa N oleva taulukko D muuttuja f irst: jonon ensimmäisen alkion indeksi jos jono on tyhjä, first kertoo mihin ensimmäinen alkio asetetaan muuttuja rear: seuraavan taulukossa vapaana olevan alkion indeksi muuttuja items: jonon alkioiden lukumäärä Tietorakenteet, syksy 2007 8
PushFront(x) taulukossa 1 2 3 alkio7 alkio8 alkio9 0 first = 6 1 2 3 alkio x alkio7 alkio8 alkio9 0 PushBack(x) taulukossa 1 2 3 alkio7 alkio8 alkio9 0 first = 6 1 2 3 alkio x alkio7 alkio8 alkio9 0 D.PushFront(x) if items = N then virhe("d täynnä") first (first + N 1) mod N D[first] x items items + 1 first = (first + N 1) mod N = 5 rear = (rear + 1) mod N = 4 D.PushBack(x) if items = N then virhe("d täynnä") D[rear] x rear (rear + 1) mod N items items + 1 first = 6 Tietorakenteet, syksy 2007 9 Tietorakenteet, syksy 2007 10 PopFront() taulukossa 1 2 3 alkio7 alkio8 alkio9 0 first = 6 1 2 3 alkio8 alkio9 0 PopBack() taulukossa alkio5 alkio6 alkio7 alkio8 alkio9 0 rear = 0 first = 4 alkio5 alkio6 alkio7 alkio8 alkio9 first = (first + 1) mod N = 7 first = 4 rear = (rear + N 1) mod N = 9 D.PopFront() if items = 0 then virhe("d tyhjä") elem D[first] vapauta D[f irst] first (first + 1)mod N items items 1 Return elem D.PopBack() if items = 0 then virhe("d tyhjä") rear (rear + N 1)mod N elem D[rear] vapauta D[rear] items items 1 Return elem Tietorakenteet, syksy 2007 11 Tietorakenteet, syksy 2007 12
Taulukko A Obj. x
Obj. x A3 Obj. x A3 viite seuraav. alkioon A3 Obj. x A4 Linkitetyn listan solmu (node) Javalla class Node { private Object element; private Node next; public Node() { this(, ); } public Node(Object e, Node n) { element = e; next = n; } public void setelem(object newelem) { element = newelem; } public void setnext(node newnext) { next = newnext; } public Object getelem() { return element; } public Node getnext() {return next; } } Tietorakenteet, syksy 2007 14
Tyypillinen yhteen suuntaan linkitetty lista: An : viite ensimmäiseen solmuun : viite viimeiseen solmuun = =, jos lista tyhjä kukin solmu omaa viitteen seuraavaan solmuun viimeisen solmun viite = An Lisäys linkitetyn listan L alkuun L.InsertFront(x) tmp new Node(x, ) if = then tmp tmp Tietorakenteet, syksy 2007 15 Tietorakenteet, syksy 2007 16 An An Lisäys linkitetyn listan L loppuun L.InsertBack(x) tmp new Node(x, ) if = then tmp else.setnext(tmp) tmp Poisto linkitetyn listan L alusta L.RemoveFront() if = then virhe("lista tyhjä") elem.getelem().getnext() if = then return elem Tietorakenteet, syksy 2007 17 Tietorakenteet, syksy 2007 18
An Poisto linkitetyn listan L lopusta L.RemoveBack() tmp.setnext() if = then elem.getelem() virhe("lista tyhjä") tmp if = then return elem return L.RemoveFront() tmp while tmp.getnext() do tmp tmp.getnext() Tietorakenteet, syksy 2007 19 Kaksiloppuisen jonon toteutusvaihtoehtoja Kuvatut linkitetyn listan lisäys/poisto-operaatiot toteuttavat kaksiloppuisen jonon tilavaatimus: O(n), missä n jonon alkioiden lukumäärä (vrt. taulukkototeutus: O(N)) tila skaalautuu suoraan solmujen lukumärään suhteen taulukkototeutuksen operaatioiden suoritusaika Θ(1), mutta......linkitetyn listan metodi RemoveBack() eli PopBack() oli O(n) toiseksi viimeisen solmun haku! Tietorakenteet, syksy 2007 20 Kahteen suuntaan linkitetty lista Myös viimeisen solmun poisto onnistuu ajassa Θ(1), jos käytetään kahteen suuntaan linkitettyä listaa An kukin solmu omaa viitteen sekä seuraavaan että edeltävään solmuun toteutus samankaltainen kuin yhteen suuntaan linkitetyllä listalla Kahteen suuntaan linkitetty lista An DL.InsertFront(x) tmp new Node(x,, ) if = then tmp else.setprev(tmp) tmp Tietorakenteet, syksy 2007 21 Tietorakenteet, syksy 2007 22
Kahteen suuntaan linkitetty lista An Kahteen suuntaan linkitetty lista An DL.RemoveFront() if = then virhe("lista tyhjä") elem.getelem().getnext() if = then else.setprev() return elem Tietorakenteet, syksy 2007 23 Lisäys/poisto kaksoislinkitetyn listan lopussa onnistuu symmetrisesti, Prev Next Tietorakenteet, syksy 2007 24