Markku Siermala, IMT Bioinformatiikan koulutusohjelma 30.11.2004 Tietorakenteet Markku Siermala, IMT Bioinformatiikan koulutusohjelma 30.11.2004
Yleistä (1) tietorakenne = rakenne, jossa tieto esitetään/säilytetään/operoidaan miksi tietoa mallinnetaan rakenteellisesti tieto luonnollisessa muodossa jotkin operaatiot helppo tai nopea toteuttaa tai yleensä mahdollista toteuttaa
Yleistä (2) alkio, tiedon yksikkö, joiden suhteista rakentuu tietorakenne lista, 1-ulotteinen rakenne, ulottuvuutena pituus taulukko, 2-ulotteinen rakenne, ulottuvuutena pituus ja leveys puut, ulottuvuutena syvyys ja leveys graafi
Lista (1) joukko arvoja, skalaareja, osoitteita, listoja yms. peräkkäin lueteltuna [2,5,f,6,8,r,sss,MATTI] listan alamuotoja pino LIFO jono FIFO vektori
Lista (2) yksinkertainen tapa pitää useita alkioita yhdessä, muuttujilla monasti mahdoton alkiolukumäärän ylärala on yleensä muistin koosta kiinni alkiot saatavissa kiinni indekseillä tai osoittimilla listojen käsittelyyn paljon valmiita funktioita
Lista (3) Tavallisia listojen funktioita alkion lisäys ja poisto päistä tai oikeaan positioon alkioiden järjestäminen etsintä vektori-kontekstiin liittyvät operaatiot
Lista (4) Lista perlissä myöhemmin lisää perlin listoista alkaa @-merkillä esim: @Nimet yleensä alustetaan samalla @Nimet = (”Jussi”,”Lissu”); myöhemmin lisää perlin listoista
Tietue yhteen avaimeen sidotaan (vakio määrä) joukko arvoja nimi, ikä C:ssä struct-tyyppi struct auto { char Nimi[20]; int Vuosiluku; } perlissä ei luonnollista tietue-rakennetta
Assosiatiivinen taulukko (1) avain ja tieto –pari lokusID ja geeni: (678,ZFP36L2) erittäin hyödyllinen, kun tarvitaan nopeaa hakemista (sisäinen viittausrakenne) perlissä silppu (engl. hash) arvoilla EI järjestystä!!
Silppu esittely alkion laittaminen silppuun: %LocusIDToOfficialSymbol = (); avaimena skalaari esim. locusID-numero arvona skalaari,lista tai silppu yms. edellä silppu alustettiin tyhjäksi (hyvä tapa) alkion laittaminen silppuun: $LocusIDToOfficialSymbol{678}= ZFP36L2; alkion ottaminen silpusta: $GeneName = $LocusIDToOfficialSymbol{678};
Puut monet rakenteet ympärillämme ovat puu-hierargiassa organisaatiot sukupuut skenaariot/toimintamallit tietokoneen hakemistorakenne
Puista Binääripuu: puun jokaisella alkiolla on kaksi lasta luonnollinen sovellus on lajittelutarkoitus arvot sijoittuvat puussa arvonsa mukaan, vasemmalla pienemmät arvot ja oikealla suuremmat nopettaa alkion/position etsintää -> tiedon hallintaa
Muita puita AVL-puu B-puu Restricted universe tree yms. binaarinen hakupuu tasapainotusehdolla B-puu kompleksisempi binääripuuta esim. sukupuu-informaatioon sopiva Restricted universe tree yms. joillain erikoisrakenteilla ja ehdoilla saadaan esim. hakuoperaatioita yms. nopeutettua
Graafi Joukko solmuja ja linkkejä esim. kaupunkien väliset tieverkostot
Muistinkäsittely (1) yleisesti muuttujan esittelyssä sille automaattisesti varataan tarvittava määrä muistia tämän takia esim. C:ssä (ja siis myös C++:ssa) on tarkkaa, mitä muuttujaan saa sijoittaa perlissä muistinkäsittely on enemmän ”piilossa”
Muistinkäsittely (2) perlissä listan kokoa kasvatetaan lisäämällä sinne alkioita ja päinvastoin @Lista = (@Lista,”Jussi”); C:ssä listan koko pitää päättää koodattaessa int Luvut[30]; ja listan ulopuolelle ei saa viitata esim. viittaus alkioon 35 kaataisi ohjelman suorituksen (ylivuoto)
Muistinkäsittely (3) Dynaaminen muistinkäsittely mahdollistaa ajonaikaisen listan koon muuttamisen C:ssä. linkitetty lista: juuri,alkioita riippumassa osoittimien ketjussa ja viimeinen alkio ”maadoitettu”.
Perl ja listat (1) esittely ja alustus @Lista = (); @NimiLista = (”Antti”,”Jussi”,”Elias”); @_ = (1,2,3,4,5,6,7,8,9,10); #oletuslista @NumeroLista = (@_,11); @ListOfLists = (@NimiLista ,@NumeroLista);
Perl ja listat (2) alkioon viittaaminen indeksointi alkaa nollasta!!! alkion viittauksessa käytetään listan nemen edessä skalaari-operaattoria $Nimi = $NimiLista[2]; $JokuArvo = $ListOfLists[6]; mikä arvo tulee ed. muuttujaan ($Luku,@_) = @ListOfLists;
Perl ja listat (3) viittaaminen jatkuu esim. $JokuArvo = $ListOfLists[$MyIndex]; esim. $MyIndex = 0; @ListForNumbers = (); while($MyIndex < 100) { @ListForNumbers = (@ListForNumbers,$MyIndex); $MyIndex = $ MyIndex + 1; } $ListanKoko = @ListForNumbers;#laittaa muuttujaan listan koon
Perl ja valmiit funktiot kutsu yleensä $palautusArvo = FunktionNimi($Parametri1,$Parametri2...)
Perlin listafunktioita push: push(@_,12); laittaa listan viimeiseksi alkioksi uuden pop:$Arvo = pop(@_); poistaa viimeisen arvon ja laittaa muuttujaan vastaavasti shift ja unshift listan alkupäälle reverse-kääntää listan järjestyksen sort-järjestää AAKKOS-järjestykseen
Listoista (1) foreach ohjausrakenne, jossa jokainen listan alkio sij. muuttujaan ja käsitellään lohkossa syntaksi: foreach $ListanAlkio (@ItseLista) { print $ListanAlkio ”\n”; }
Tiedosto suoraan listaan esim. tiedoston lukeminen listaan ja yhden alkion tulostus open(Lukija,”Teksti.txt”);#avataan kahva tiedostoon @Lista = <Lukija>;#lukee oletuslistaan Testi.txt:n chomp(@Lista);#poistaa kaikkien rivien lopusta rivinvaihtomerkin print $Lista[456],”\n”;
Muuta (1) Perliohjelmassa on automaattisesti käytössä lista @ARGV, jossa on taletettuna ohjelman käynnistyskäskyn yhteydessä annetut parametrit. perl LaskeKeskiarvo.pl 2 4 5 6 ------------------------------- $ParametrilistanPituus = @ARGV; $Value = $ARGV[2];
Muuta (2) esim. 2. ohjelamaparametreista: perl CheckName.pl Antti Auramo ------------------------------- $ParametrilistanPituus = @ARGV; $FirstName = $ARGV[0];#Antti $LastName = $ARGV[1];#Auramo
Muuta (3) tekstihakutoiminnon voi tehdä index-funktiolla: index(hakuteksi,haettavamjono) $Position = index(”RNSKSFJSAJAS”,”SK”); palauttaa sen position, jossa ensimmäinen sovittuva merkki esiintyy, esimerkissä palautetaan luku 2 (koska indeksointi alkaa nollasta) jos merkkiä ei esiinny, palautetaan -1
Mietittävää (1) Millainen on ohjelma, joka kysyy jäyttäjältä 5 nimeä ja tallettaa ne listaan, tulostaa nimet käänteisessä järjestyksessä lukee kysyy käyttäjältä nimejä ja numeroita ja tallettaa ne silppuun siten, että nimi on avain ja numero on arvo, kunnes törmää merkkijonoon ”lopetus” sekä tämän jälkeen tulostaa silpun sisällön? *) silpun avaimet saadaan listaan funktiolla: @Avaimet = keys(%Silppu);
Mietittävää (2) Millainen on ohjelma, joka saa parametrina tiedostonimen ja tulostaa tiedoston ne rivit näytölle, joissa esiintyy b, c, d, f, g, x tai z -kirjain. on kuten edellinen, mutta tulostaa ne rivit, joissa esiintyy a, r ja t samalla rivillä.