811312A Tietorakenteet ja algoritmit 2017-2018 II Perustietorakenteet
Sisältö 1. Johdanto 2. Pino 3. Jono 4. Lista 811312A TRA, Perustietorakenteet 2
II.1. Johdanto Tietorakenne on tapa, jolla algoritmi 1. säilöö ja 2. järjestää käyttämäänsä dataa Määritelmä: Tietorakenne on äärellinen dynaaminen joukko, joka toteuttaa rajapintanaan sarjan operaatioita joiden kautta algoritmi voi muokata joukkoa. 811312A TRA, Perustietorekenteet 3
II.1. Johdanto (2) Tietorakenteen sisäinen rakenne: Joukko alkioita Alkioilla sisäinen rakenne Alkioihin voidaan yksikäsitteisesti osoittaa osoittimella Alkio sisältää joukon kenttiä, yleensä ainakin Avain, käytetään alkioiden vertailuun Satelliittidata, talletettuna alkioon mutta merkityksetön tietorakenteen sisäisen toiminnan kannalta Sovelluksen kannalta olennainen 811312A TRA, Perustietorakenteet 4
II.1.1 Dynaamiset joukot Kutsutaan myös sanakirjoiksi (dictionary) Operaatiot: ETSI(S, k) Etsii joukosta S alkion, jonka avain on k. LISÄÄ(S, x) Lisää alkion x joukkoon S POISTA(S, x) Poistaa alkion x joukosta S MINIMI(S) Etsii pienimmän alkion täydellisesti järjestetystä joukosta S 811312A TRA, Perustietorakenteet 5
II.1.1 Dynaamiset joukot (2) Operaatiot jatkuu MAKSIMI(S) Etsii suurimman täydellisesti järjestetystä joukosta S SEURAAJA(S, x) Etsii täydellisesti järjestetystä joukosta S alkiosta x seuraavaksi suuremman EDELTÄJÄ(S, x) Etsii täydellisesti järjestetystä joukosta S alkiosta x seuraavaksi pienemmän HUOM! Tietorakenteessa käytettävän dynaamisen joukon ei tarvitse välttämättä tukea kaikkia operaatioita! 811312A TRA, Perustietorakenteet 6
II.2 Pino (stack) Yksinkertainen tietorakenne, joka toimii LIFOperiaatteella (Last In First Out) Viimeksi lisätty alkio otetaan ensimmäisenä pois Viimeksi lisätty alkio pinon pää tai huippu (top) Voidaan käyttää esimerkiksi järjestyksen kääntämiseen, rekursiivisten kutsujen toteuttamiseen jne. 811312A TRA, Perustietorakenteet 7
II.2.1 Pinon operaatiot Taulukolla toteutettu pino: a) Pinossa 2,4,5 b) Lisätty 7 ja 2: pino täysi c) Poistettu 2, huipulla 7 811312A TRA, Perustietorakenteet 8
II.2.1 Pinon operaatiot (2) EMPTY(S) 1. if S.head == 0 2. return TRUE 3. else 4. return FALSE PUSH(S,x) #LISÄÄ 1. S.head = S.head + 1 2. S[S.head] = x 811312A TRA, Perustietorakenteet 9
II.2.1 Pinon operaatiot (3) POP(S) 1. if EMPTY(S) # POISTA 2. error Alivuoto 3. else 4. S.head = S.head 1 5. return S[S.head + 1] HUOM! Toteutettu taulukolla, jonka ensimmäinen indeksi on 1 Kaikkien operaatioiden kesto vakio riippumatta alkoiden lukumäärästä, jos toteutetaan taulukolla -> Pino erittäin tehokas tietorakenne 811312A TRA, Perustietorakenteet 10
II.3 Jono (queue) Yksinkertainen tietorakenne, joka toimii FIFOperiaatteella (First In First Out) Ensiksi lisätty alkio otetaan ensimmäisenä pois Jonon ensimmäinen alkio on pää tai keula (head). Häntä (tail) osoittaa paikkaan viimeisen alkion jälkeen Voidaan käyttää järjestyksen ylläpitoon Toteuttaa ainakin seuraavat operaatiot: jonoon lisääminen (enqueue) ja jonosta poisto (dequeue) 811312A TRA, Perustietorakenteet 11
II.3.1 Jonon operaatiot Taulukolla toteutettu jono: 811312A TRA, Perustietorakenteet 12
II.3.1 Jonon operaatiot (2) ENQUEUE(Q,x) 1. Q[Q.tail] = x 2. if Q.tail == Q.pituus 3. Q.tail = 1 4. else 5. Q.tail = Q.tail + 1 DEQUEUE(Q) 1. x = Q[Q.head] 2. if Q.head == Q.pituus 3. Q.head = 1 4. else 5. Q.head = Q.head + 1 HUOM! Toteutettu taulukolla -> operaatioiden kesto vakio riippumatta alkoiden lukumäärästä HUOM2! Ei varauduttu ali- ja ylivuotoon 6. return x 811312A TRA, Perustietorakenteet 13
II.4 Linkitetty lista (linked list) Linkitetyissä listoissa alkiot (solmut) ovat järjestyneet peräkkäisesti (lineaarisesti) Peräkkäisyys määräytyy osoittimilla solmusta seuraavaan solmuun Jokainen alkio siis sisältää osoittimen Lista voi olla myös kahteen suuntaan linkitetty, ts. solmussa osoitin sekä seuraajaan että edeltäjään Etu taulukolla toteutettuun tietorakenteeseen: ei kiinteää ylärajaa alkioiden lukumäärälle 811312A TRA, Perustietorakenteet 14
II.4.1 Linkitetyn listan toteutusvaihtoehdot a) Tavallinen yhteen suuntaan linkitetty lista b) Kahteen suuntaan linkitetty lista c) Renkaaksi linkitetty lista 811312A TRA, Perustietorakenteet 15
II.4.2 Kahteen suuntaan linkitetyn listan operaatiot LISTA_ETSI(L,k) 1. x = L.head 2. while x NIL and x.key k 3. x = x.next 4. return x LISTA_LISÄÄ(L,x) 1. x.next = L.head 2. if L.head NIL 3. (L.head).previous = x 4. L.head = x 5. x.previous = NIL 811312A TRA, Perustietorakenteet 16
II.4.2 Kahteen suuntaan linkitetyn listan operaatiot (2) LISTA_POISTA(L,x) 1. if x.previous NIL 2. (x.previous).next = x.next 3. else 4. L.head = x.next 5. if x.next NIL 6. (x.next).previous = x.previous 811312A TRA, Perustietorakenteet 17
II.4.3. Linkitetyn listan operaatioiden aikakompleksisuus Lisääminen ja poistaminen vakioaikainen Ellei poistettavaa tarvitse ensin etsiä, tarvitsee vain katkaista linkit Alkion etsimiseen kuluva aika suoraan verrannollinen alkioiden lukumäärään 811312A TRA, Perustietorakenteet 18