A274101 TIETORAKENTEET JA ALGORITMIT



Samankaltaiset tiedostot
Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

18. Abstraktit tietotyypit 18.1

TIETORAKENTEET JA ALGORITMIT

Algoritmit 1. Luento 4 Ke Timo Männikkö

811312A Tietorakenteet ja algoritmit II Perustietorakenteet

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

Tieto- ja tallennusrakenteet

Algoritmit 1. Luento 3 Ti Timo Männikkö

Algoritmit 1. Luento 6 Ke Timo Männikkö

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit

Algoritmit 1. Demot Timo Männikkö

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

A TIETORAKENTEET JA ALGORITMIT

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Algoritmit 2. Luento 2 To Timo Männikkö

Tietorakenteet ja algoritmit - syksy

2. Perustietorakenteet

3. Binääripuu, Java-toteutus

Abstraktit tietotyypit. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Rakenteiset tietotyypit Moniulotteiset taulukot

Algoritmit 2. Luento 2 Ke Timo Männikkö

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Algoritmit 1. Demot Timo Männikkö

Algoritmit 2. Luento 7 Ti Timo Männikkö

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Tietorakenteet, laskuharjoitus 3, ratkaisuja

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

Olio-ohjelmointi Syntaksikokoelma

Listarakenne (ArrayList-luokka)

Tietorakenteet ja algoritmit

2. Seuraavassa kuvassa on verkon solmujen topologinen järjestys: x t v q z u s y w r. Kuva 1: Tehtävän 2 solmut järjestettynä topologisesti.

Rajapinta (interface)

Algoritmit 2. Luento 4 Ke Timo Männikkö

Ohjelmoinnin peruskurssien laaja oppimäärä

Algoritmit 2. Luento 4 To Timo Männikkö

Osa. Mikä on linkitetty lista Kuinka linkitetty lista luodaan Kuinka toiminnallisuus kapseloidaan periytymisen kautta

Osoitin ja viittaus C++:ssa

Java kahdessa tunnissa. Jyry Suvilehto

Ohjelmoinnin perusteet Y Python

Muita linkattuja rakenteita

A TIETORAKENTEET JA ALGORITMIT KORVAAVAT HARJOITUSTEHTÄVÄT 3, DEADLINE KLO 12:00

Tietorakenteet ja algoritmit

Ohjelmoinnin jatkokurssi, kurssikoe

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Lyhyt kertaus osoittimista

4. Perustietorakenteet: pino, jono ja lista

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Geneeriset luokat. C++ - perusteet Java-osaajille luento 6/7: Template, tyyppi-informaatio, nimiavaruudet. Geneerisen luokan käyttö.

Sisältö. 22. Taulukot. Yleistä. Yleistä

3. Pinot, jonot ja linkitetyt listat

Algoritmit 1. Luento 7 Ti Timo Männikkö

Algoritmit 2. Luento 5 Ti Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

Algoritmit ja tietorakenteet / HL Copyright Hannu Laine

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Ohjelmoinnin peruskurssien laaja oppimäärä

lähtokohta: kahden O(h) korkuisen keon yhdistäminen uudella juurella vie O(h) operaatiota vrt. RemoveMinElem() keossa

Taulukot. Jukka Harju, Jukka Juslin

Tietorakenteet ja algoritmit

Ohjelmoinnin perusteet Y Python

Osa VII. Mitä mallit ovat ja kuinka niitä käytetään Miksi mallit tarjoavat paremman vaihtoehdon makroille Kuinka luokkamalleja luodaan

Tehtävän V.1 ratkaisuehdotus Tietorakenteet, syksy 2003

Sekvenssi: kokoelma peräkkäisiä alkioita (lineaarinen

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Ohjelmointi 2 / 2010 Välikoe / 26.3

(a) L on listan tunnussolmu, joten se ei voi olla null. Algoritmi lisäämiselle loppuun:

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Tietorakenteet, laskuharjoitus 10, ratkaisuja. 1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

A TIETORAKENTEET JA ALGORITMIT

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Olio-ohjelmointi Javalla

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Algoritmit 1. Luento 14 Ke Timo Männikkö

Algoritmit 1. Luento 9 Ti Timo Männikkö

Algoritmit 1. Luento 8 Ke Timo Männikkö

Tietorakenteet, laskuharjoitus 4,

Ohjelmoinnin peruskurssien laaja oppimäärä

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Ohjelmistotuotanto, kurssikoe , H. Laine Arvostelu

Tietueet. Tietueiden määrittely

Jakso 4 Aliohjelmien toteutus

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

16. Javan omat luokat 16.1

Ohjelmoinnin perusteet Y Python

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Ohjelmoinnin peruskurssien laaja oppimäärä

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Aikavaativuuden perussäännöt

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Tietorakenteet, laskuharjoitus 6,

Transkriptio:

A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen toteutukseen Määrittelyyn kuuluu tietojen keskinäinen organisointi toimenpiteet, jotka rakenteelle voidaan tehdä Abstraktille tietotyypille käytetään lyhennettä ADT (Abstract Data Type). käsitellään seuraavat ADT:t sekä niiden toteutustapoja lista (list) pino (stack) jono (queue) 27.9.2005 KyAMK - TiRak, syksy 2005 2 ABSTRAKTI TIETOTYYPPI TIETOTYYPPIEN TOTEUTUKSESTA ADT:n toteutus voi käsittää seuraavat osat Liitäntä (interface) Toteutus (implementation) Asiakas (client) 1. Liitäntä (interface) Sisältää tietotyypin määrittelyn siten, että käyttäjä pystyy hyödyntämään sitä tietämättä enempää Javassa rajapinta (tai abstrakti luokka) C++:ssa luokkamäärittely (tiedosto luokka.h) Ideana on kapselointi (encapsulation) Tietorakenteen käyttäjän ei tarvitse tuntea sen toteutustapaa Toteutus voi myöhemmin muuttuakin kunhan vain liitäntä pysyy ennallaan 2. Toteutus, "implementaatio" (implementation) Sisältää varsinaisen ohjelmakoodin rakenteelle suoritettavat toimenpiteet Javassa rajapinnan tai abstraktin luokan implementointi C++:ssa luokan metodit 3. Asiakas (client) Ohjelma, joka käyttää tietorakennetta ei tarvitse tietää toteutusta Sovellus toimii, vaikka tietorakenteen toteutus muuttuisi vähentää korjaustarvetta asiakkaan koodiin Lista, pino ja jono toteutustapa voi olla joko Taulukko Linkitetty lista Taulukon käyttö tuttua ja yksinkertaista Taulukolla on kiinteä koko Voidaan viitata suoraan indeksillä Linkitetty lista Koostuu alkioista (node) Alkiot on linkitetty toisiinsa, kuten esim. alla data data data data 27.9.2005 KyAMK - TiRak, syksy 2005 3 27.9.2005 KyAMK - TiRak, syksy 2005 4

LINKITETTY LISTA Linkitetty lista on ns. dynaaminen tietorakenne Listan alkioiden järjestys määräytyy osoittimien avulla Esimerkki: Alkion toteutus Javalla class Node { Object data; Node next; public Node() { data = null; next = null; Huom: Lista ADT ja linkitetty lista ovat eri asia! Lista ADT voidaan määritellä rekursiivisesti: Lista on tyhjä, tai se on alkio, jota seuraa lista. Lista voidaan esittää alkioiden luettelona: a 1, a 2,, a n Lista ADT:n operaatioita (ei täydellinen) CreateList - luo tyhjän listan IsEmpty - vastaus kysymykseen, onko lista tyhjä InsertNode - lisää solun listaan (annetun solun perään) DeleteNode - poistaa solun listasta FindData - etsii solua, jonka data annettu NextNode - annettua solua seuraava solu PreviousNode - annettua solua edeltävä solu PrintList - tulostaa listan sisällön DeleteList - tuhoaa koko listan 27.9.2005 KyAMK - TiRak, syksy 2005 5 27.9.2005 KyAMK - TiRak, syksy 2005 6 Taulukkototeutus 2-ulotteinen taulukko 1. kentässä data 2. kentässä linkki 249 343 128 992 2 5 1 Ominaisuuksia Muistinvaraus etukäteen suurin mahdollinen määrä? Etuna on, että jokainen alkio voidaan hakea yhtä nopeasti Lisäys on hidasta, ellei lisätä aina loppuun Jos lisätään keskelle joudutaan siirtämään alkioita, aikavaatimus O(n) Poistaminen myös hidasta joudutaan siirtämään alkioita, O(n) Ongelmia tulee jatkossa keskitytään enemmän linkitettyyn listaan Toteutus linkitettynä listana Rakenne data data data data Linkitetyn listan ominaisuuksia Ei tuhlaa muistia varataan jokaiselle uudelle alkiolle erikseen Uuden alkion lisäys on nopea, O(1) Etsintä on hitaampaa kuin taulukolla, O(n) Alkion poisto on hidas, kuten taulukollakin, O(n) Käytännössä listan alkuun kannattaa sijoittaa tyhjä alkio (head) osoittamaan ensimmäiseen varsinaiseen alkioon 27.9.2005 KyAMK - TiRak, syksy 2005 7 27.9.2005 KyAMK - TiRak, syksy 2005 8

Esimerkki public class LinkedList { private Node head; // osoittaa 1. alkioon public LinkedList() { head = new Node(); // Luo head-alkion, joka ei osoita // mihinkään (huom. Noden toteutus) public boolean isempty() { if (head.getnext() == null){ return true; return false; 27.9.2005 KyAMK - TiRak, syksy 2005 9 Luonnin jälkeen lista siis sisältää vain yhden alkion (head) Head-alkion data on merkityksetön (sisältää mitä sattuu) Head-alkion linkki ei aluksi osoita minnekään, vaan sen arvona on null Voidaan käyttää tarkistamaan, onko lista tyhjä (isempty() metodi) 27.9.2005 KyAMK - TiRak, syksy 2005 10 TÄRKEIMMÄT LISTAN OPERAATIOT Lisääminen 1. Luodaan uusi alkio 2. Asetetaan siitä linkki seuraavaan alkio 3. Käännetään linkki edellisestä alkiosta uuteen alkioon data 2. data 1. 3. X data TÄRKEIMMÄT LISTAN OPERAATIOT Poistaminen 1. Etsitään poistettavaa alkiota edeltävä alkio 2. Asetetaan siitä linkki poistettavaa seuraavaan alkioon 3. Poistetaan alkio 1. X data data data 3. 2. 27.9.2005 KyAMK - TiRak, syksy 2005 11 27.9.2005 KyAMK - TiRak, syksy 2005 12

TÄRKEIMMÄT LISTAN OPERAATIOT LISTOJEN KÄYTÖSTÄ Läpikäynti (traverse-list) Käydään läpi listan jokainen alkio ja tehdään siinä yhteydessä jotakin Ei yksinään tee siis mitään, vaan liittyy aina johonkin toimintaan Alkoiden määrän laskeminen, listan lopun etsiminen, Tärkeä järjestämisalgoritmeissa public void traverselist() { Node p = this.gethead(); while (p.getnext()!= null) { p = p.getnext(); dosomething(); Listoja käytetään, kun dynaamisesta rakenteesta on huomattavaa hyötyä Uutta tietoa syntyy ja vanhaa poistuu Muistin määrä on rajoitettu (sulautetut järjestelmät) Muita listarakenteita Kahteen suuntaan linkitetty lista data data data data Rengaslista data data data data 27.9.2005 KyAMK - TiRak, syksy 2005 13 27.9.2005 KyAMK - TiRak, syksy 2005 14 PINO ADT (STACK) JA SEN TOTEUTUS PINO ADT (STACK) JA SEN TOTEUTUS Pino on rakenteeltaan kuten lista, mutta eroaa toiminnaltaan merkittävästi Pino toimii ns. LIFO periaatteella (Last In, First Out) eli Pinoon voidaan tallettaa vain "päälle Pinosta voidaan poistaa vain päältä Tyypillisiä pinon toimenpiteitä ovat Push - Tallennus pinoon päällimmäiseksi (Insert) Top - Päällimmäisen alkion haku poistamatta sitä (Find) Pop - Päällimmäisen alkion haku poistamalla (Delete) Pino on toiminnoiltaan rajoitettu lista Voidaan toteuttaa sekä taulukkona että linkitettynä listana Toimenpiderajoitukset on otettava huomioon Toteutuksena katsotaan linkitettyä listaa Lista koostuu samantyyppisistä alkioista kuin edelläkin Head alkion käyttö jälleen hyödyllistä 27.9.2005 KyAMK - TiRak, syksy 2005 15 27.9.2005 KyAMK - TiRak, syksy 2005 16

PINON KÄYTTÖSOVELLUKSIA Symbolien balanssin tarkastus: Tarkastellaan matemaattisessa lausekkeessa esiintyviä sulkumerkkejä () [] { Merkkejä voi olla peräkkäin ja sisäkkäin "kielioppi" oikein, jos samantyyppiset vasen ja oikea sulku esiintyvät pareittain Lauseke 1: { [ ( ) [ ( ) ] ( ) ] ( ) Oikein Lauseke 2: [ ( ) { ( ) { ( ) ] ( ) ] Väärin PINON KÄYTTÖSOVELLUKSIA Tarkastusalgoritmi: Luetaan lauseketta merkki kerrallaan Jos merkki on vasen sulku, talletetaan se pinoon Jos merkki on oikea sulku, luetaan yksi merkki pinosta - jos luettu on samaa tyyppiä oleva vasen sulku, ok Lauseke on virheellinen jos: pinosta tulee vääräntyyppinen vasen sulku pino on tyhjä sieltä luettaessa luettavien merkkien loppuessa pino ei ole tyhjä 27.9.2005 KyAMK - TiRak, syksy 2005 17 27.9.2005 KyAMK - TiRak, syksy 2005 18 PINON KÄYTTÖSOVELLUKSIA Funktion kutsu: Ohjelmointikielissä funktion kutsu toteutetaan lähes aina pinon avulla Tallennettavaa tietoa ovat parametrit paluuosoite Esim. C-kielisen kutsun f( a, b, c ) suorituksen jälkeen pinon 4 päällimmäistä alkiota ovat: c, b, a, paluuosoite. JONO ADT (QUEUE) Jono on myös rakenteeltaan listan kaltainen Ero: jono toimii FIFO periaatteella (First In, First Out) Jonoon voidaan tallentaa vain loppuun Jonosta voidaan poistaa vain alusta Tyypillisiä jonon toimenpiteitä ovat Enqueue First Dequeue - Tallennus jonoon viimeiseksi (Insert) - Ensimmäisen alkion haku poistamatta sitä (Find) - Ensimmmäisen alkion haku poistamalla se (Delete) 27.9.2005 KyAMK - TiRak, syksy 2005 19 27.9.2005 KyAMK - TiRak, syksy 2005 20

JONO ADT (QUEUE) PAKKA ADT (DEQUE) Jono on toiminnoiltaan rajoitettu lista voidaan myös toteuttaa taulukkona tai linkitettynä listana Jonolla on lukuisia käyttökohteita Matematiikassa sillä on oma tutkimusalueensa, jonoteoria Teknillisiä käytännön esimerkkejä prosessien suoritusjono moniajoympäristössä tulostusjono jono palvelimen levylle verkkoympäristössä puhelujono puhelinkeskuksessa Jono on keskeinen tietorakenne myös tietokonesimuloinneissa Pakka on pinon ja jonon yhdistelmä Pakkaa voidaan käsitellä sekä pinoettä jono-operaatioilla Pakkaan voidaan siis tallentaa sekä alkuun tai loppuun Pakasta voidaan hakea sekä alusta tai lopusta 27.9.2005 KyAMK - TiRak, syksy 2005 21 27.9.2005 KyAMK - TiRak, syksy 2005 22 SEURAAVALLA KERRALLA Puurakenteet Mikä on puutietorakenne? Binääripuu 27.9.2005 KyAMK - TiRak, syksy 2005 23