INF1010 siste begreper før oblig 2 Sammenligning. Mer lenkede lister. Forskjellige listeimplementasjoner. Binære trær. Bittelitt om grensesnitt (interface).
Dagens forelesning Flere temaer på grunn av obligatorisk oppgave 2. sammenligning av variable forskjellige modeller for lenkelister litt mer om lenkelister binære søketrær Litt om grensesnitt michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 2
int versus Integer int a, b; Integer aa, bb; a = 7; aa = new Integer ( 7 ) ; b = 7; bb = new Integer ( 7 ) ; i f ( a==b) System. out. println ( l i k ) ; else System. out. println ( ulik ) ; i f ( aa==bb) System. out. println ( l i k ) ; else System. out. println ( ulik ) ; Vi får utskriften: lik ulik Vi skjønner lettere hvorfor ved å tegne en figur av datastrukturen, og undersøke hvordan == og.equals() er definert. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 3
int versus Integer int 7 a 7 Integer aa int 7 b 7 Integer bb == virker tilsynelatende forskjellig for variable av primitive typer (som int) og referansevariable. a==b evalueres til true hvis a og b har samme verdi. a og b har samme verdi (7). aa og bb har ikke samme verdi. (Hint: når variablene er pekere, les == som «peker på det samme som».) Pekervariable inneholder adressen til objektet i primærlageret. Forskjellige objekter har forskjellige adresser og variablene får derfor forskjellige verdier. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 4
==,.equals() i f ( a == b) Hva blir utskriften av dette System. out. println ( l i k ) ; programmet når datastrukturen ser else System. out. println ( ulik ) ; ut som følger: i f (b == c ) System. out. println ( l i k ) ; String "tre" "fire" else System. out. println ( ulik ) ; a i f ( a. equals (b ) ) System. out. println ( l i k ) ; String "tre" else System. out. println ( ulik ) ; i f ( a. equals ( c ) ) System. out. println ( l i k ) ; else System. out. println ( ulik ) ; b String c String d michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 5
Lenkede lister hvorfor? små mengder (av objekter) ukjent antall (få til noen) varierende antall under kjøring usortert hvis mange objekter: enkel innsetting og uttaking (lifo, fifo) sjelden/aldri søke ut bestemte objekter michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 6
Lenkede lister hvorfor? I INF1010 først og fremst fordi vi skal kunne lage (enkle) datastrukturer med pekere og for at vi skal forstå og selv kunne lage programpakker som Javas Class LinkedList eller Class HashMap. To grunnleggende måter (i Java og andre programmeringsspråk) å håndtere mengder av objekter, enten i et array, eller ved hjelp av lenke-strukturer (f.eks. lenkelister og trær). michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 7
Klassehierarki à la oblig1 class Person { LenkeListe venner ;..... } class { ; Person p; } class LenkeListe { førstelistee, sistelistee ; } void settinn ( le ) { } finn ( String navn) { }...... michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 8
Liste med 4 personer. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 9
Generalisering av lista class { ; Object obj ; } class LenkeListe { førstelistee, sistelistee ; void settinn ( Object o ) { } finn ( String navn) { }...... } Listeelementene kan peke på objekter av hvilken som helst klasse michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 10
Generalisering av lista Object Object Object førstelistee obj obj obj michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 11
Generisk liste med indre klasse class LenkeListe<E> { class { ; E data ; } } førstelistee, sistelistee ; void settinn ( E e ) { } finn ( E pekerpaaobjektliktdette ) { }...... Lenkeliste <Person> personliste = new LenkeListe <Person> ( ) ; Lenkeliste <Ord> ordliste = new LenkeListe <Ord> ( ) ; michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 12
Tilbake til listestrukturen Vi ser bare på listeelementene og hvordan disse kan manipuleres. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 13
Noen metoder kan flyttes til listeelementene fle void settinnsist(...) taut(...) Lliste lista michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 14
Innsetting sist objektorientert måte Ideen er at settinnmetoden er definert inne i listeelementklassen, og at objektet som skal settes inn (pekt på av parameteren e) sendes videre til objekt (!= null) ved å kalle på samme metode i objekt, inntil man når slutten ( == null). class { ; // kan peke på listeelement } void settinnsist ( e ) { i f ( == null ) = e ; else. settinnsist ( e ) ; } // andre metoder og variable Bruk av «sistepeker» er enklere. Motivasjon for å gjøre det slik ser vi når vi kommer til binære søketrær. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 15
I metoden i første listeelement void settinnsist( e) e void settinnsist( e) e void settinnsist( e) e void settinnsist( e) e void settinnsist( e){ if ( == null) = e; else.settinnsist(e); } michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 16
I metoden i andre listeelement void settinnsist( e) e void settinnsist( e) e void settinnsist( e) e void settinnsist( e) e void settinnsist( e){ if ( == null) = e; else.settinnsist(e); } michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 17
I metoden i tredje listeelement void settinnsist( e) e void settinnsist( e) e void settinnsist( e) e void settinnsist( e) e void settinnsist( e){ if ( == null) = e; else.settinnsist(e); } michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 18
Ferdig. Ingen metode kalt void settinnsist( e) void settinnsist( e) void settinnsist( e) void settinnsist( e) e e e e void settinnsist( e){ if ( == null) = e; else.settinnsist(e); } michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 19
Sorterte lister (f.eks. alfabetisk) Fordel: Enklere/raskere å finne objekter (særlig hvis det vi leter etter ikke er i lista). Ulempe: Mer komplisert å sette inn Ville det være hensiktsmessig å bruke en sortert lenket liste med ett objekt pr. person for å lage en database for Kinas (1.400.000.000 innb.) folkeregister? michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 20
Binære søketrær Trær er en spesiell form for datastruktur (minner om trær med forgreninger). En liste er et unært tre, dvs. maks en gren (peker) i en forgrening. Et binært tre har maksimalt to grener i en forgrening. Et søketre er et tre hvor objektene er organisert for å optimalisere søking, gjenfinning. I INF1010 vil bruke begrepene tre, binærtre eller søketre og alltid mene et binært søketre med mindre det eksplisitt sies noe annet. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 21
Hvorfor binære søketrær Hvis treet bygges riktig opp, er det mye, mye raskere å finne igjen et bestemt objekt. Vi beholder lenkestrukturens fleksibiltet, og unngår ulempen lenkelista hadde med mange elementer. I stedet for en peker, har binærtreet to, og for å holde dem fra hverandre, kalles de venstre og høyre. Elementene som treet bygges opp av kalles i litteraturen binærtrenode, eller som oftest bare node. Vi kunne gjerne kalt det binærtreelement, men det er litt langt. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 22
Bygge opp et binært søketre klassedefinisjoner class Node { // Object data ; / / peker t i l objektet som hører t i l denne noden // <T> data ; // en bedre mulighet String data ; // identifiserer objektet i dette eksempelet Node venstre, høyre ; // de to pekerne } class Tre { Node rot ; } Den siste klassen holder på hele treet. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 23
Binærtrenode datastruktur ett objekt Node venstre Node høyre martsv Person data martsv martsv Samme objekt tegnet 3 ganger. Nodeobjektet kan peke på et personobjekt. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 24
Binærtrenode datastruktur ett objekt Node venstre Node høyre martsv Object data martsv martsv Samme objekt tegnet 3 ganger. Nodeobjektet kan peke på et hvilket som helst objekt. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 25
Binærtrenode datastruktur ett objekt Node venstre Node høyre martsv data <E> martsv martsv Samme objekt tegnet 3 ganger. Nodeobjektet kan peke på et objekt av type E (generisk). michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 26
Bygge opp et binært søketre innsettingsmetode I dette første eksemplet legger vi settinnmetoden i klassen Node, slik at å sette inn i et binærtreelement (nynode) i hele treet gjøres ved kallet rot.settinnnynode(nynode); Vi forutsetter at objektet data peker på har en metode compareto(), som gir en ordning på objektene (à la String.compareTo()). Gitt to objekter: Object a, b; a.compareto(b) > 0 hvis a > b = 0 hvis a = b < 0 hvis b > a michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 27
class Node { String data ; // identifiserer objektet Node venstre, høyre ; // de to pekerne } settinnnynode (Node nn) { int cmpt = data. compareto(nn. data ) ; i f (cmpt < 0) { // data < nn, nn skal mot høyre i f ( høyre==null ) høyre = nn; else høyre. settinnnynode (nn ) ; } else i f (cmpt > 0) { // data > nn, nn skal mot venstre i f ( venstre==null ) venstre = nn; else venstre. settinnnynode (nn ) ; } // cmpt == 0, her kaster vi nn. } michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 28
Rotkallet (metodekallet i rotobjektet) Node settinnnynode(node nn) rot martsv krigu Node nynode chrifs shaziam rot.settinnnynode(nynode); michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 29
I metoden i objektet «chrifs» Node rot settinnnynode(node nn) martsv krigu Node nynode chrifs shaziam venstre.settinnnynode(nn) michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 30
I metoden i objektet «chrifs» Node rot settinnnynode(node nn) martsv chrifs shaziam krigu Node nynode michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 31
Det nye objektet på rett plass Node rot martsv chrifs shaziam krigu michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 32
Et litt større tre Node tre marishu johnaby ramting daghf kyrrewk odarn thorhw alexso gunnabj simenbu NB! Strukturen avhenger av rekkefølgen objektene settes inn i. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 33
Hva man må vite om grensesnitt før man starter med oblig 2. michael@ifi.uio.no INF1010 17. februar 2011 (uke 7) 34