Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else.

Liknende presentasjoner


Presentasjon om: "Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."— Utskrift av presentasjonen:

1 Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17 Datastrukturer og algoritmeteori Graferside 2 Listerside 3-6 Java API: Collection, List og LinkedListside 7-9 Køside 10 Stakkside 11 Rekursjonside 12 Trær inkl. binære søketrærside Java API: Map og TreeMapside Hashtabellerside Iteratorerside 26

2 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 2 Grafer Anvendelser –visualisering av datanettverk –logistikk –formell kartlegging av et objektorientert programsystem node kant En urettet graf En rettet og vektet graf

3 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 3 Lister Dataene ordnes sekvensielt på tilsvarende måte som i en tabell Aktuelle operasjoner på liste –Sett inn et element i listen: først, sist eller på en bestemt posisjon. –Fjern et element fra listen. –Gå gjennom alle elementene i listen. Lister i forhold til tabeller –Begge datastrukturene holder orden på dataene i en bestemt rekkefølge. –Størrelsen på en liste er helt dynamisk, den endres ved at elementer settes inn og tas ut. En tabell kan ikke endre størrelse etter at den er opprettet. –Å finne et bestemt element i en liste kan ta tid på grunn av at en alltid må gå inn fra enden av listen. Ethvert element i en tabell kan aksesseres direkte ved hjelp av indeksen. Enkeltlenket listeDobbeltlenket liste

4 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 4 Noen listeoperasjoner i mer detalj Å sette inn et element i slutten av listen Å sette inn et element på en bestemt plass i listen (foran *) * * Hvorfor kan vi ikke gjøre de to operasjonene i motsatt rekkefølge?

5 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 5 Eksempel, en liste med navn class NavneElement { private NavneElement neste; private String navn; public NavneElement(String startNavn) { navn = startNavn; } public NavneElement(String startNavn, NavneElement startNeste) { navn = startNavn; neste = startNeste; } public String finnNavn() { return navn; } public NavneElement finnNeste() { return neste; } public void settNavn(String nyttNavn) { navn = nyttNavn; } public void settNeste(NavneElement nyNeste) { neste = nyNeste; } NavneElement neste navn finnNavn finnNeste settNavn settNeste neste PerLiseEliAnne null

6 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 6 Klassen Navneliste NavneListe førsteElement skrivUtAlleNavn settInnNavnTilSlutt søkEtterNavn slettNavn (toString()) Vis programliste 17.2 og 17.3 side Gjør oppgavene side 563

7 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 7 Interface java.util.Collection Fellestrekk for klasser som implementerer dette interfacet: –en samling elementer av forskjellige typer –metoder (husk at vi foreløpig ikke har noen implementasjoner!) public boolean add(Object add) public boolean contains(Object obj) public boolean containsAll(Collection annenSamling) public boolean remove(Object obj) public boolean removeAll(Collectiön samling) public int size() Samlinger kan klassifiseres etter to parametre –er duplikater tillatt? –er elementene ordnet? Duplikater ikke tillatt OrdnetIkke ordnet Duplikater tillatt Liste Hashtabell (selve tabellen, i mange tilfeller) Multimengde Mengde

8 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 8 Interfacet java.util.List List er sub-interface til Collections: –Elementene skal være ordnet List krever flere metoder implementert: –public void add(int posisjon, Object obj) –public Object set(int posisjon, Object obj) –public Object remove(int posisjon) –public Object get(int posisjon) Virker det kjent? Klassen ArrayList implementerer dette interfacet. Kan gjerne ha identiske data i en liste, og kanskje til og med flere referanser til det samme objekt (som i ArrayList). Implementasjonen av add() bestemmer slike ting, det dikteres ikke av interfacet.

9 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 9 Klassen java.util.LinkedList Implementerer List (og dermed også Collections) Skal ha den ytelsen som man kan vente av en dobbeltlenket liste Klassen tilbyr flere metoder enn det interfacet krever –public void addFirst() –public void addLast() –public Object removeFirst() –public Object removeLast() Gjør oppgaven side 565

10 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 10 Kø En kø er en ordnet samling med data hvor data settes inn og tas ut et bestemt sted. FIFO-kø –First In First Out Operasjoner –sett inn et element –ta ut et element import java.util.*; class FIFOKo { private LinkedList liste = new LinkedList(); public void settInnElement(Object objekt) { liste.addLast(objekt); } public Object taUtElement() { return liste.removeFirst(); } public int finnAntallElementer() { return liste.size(); }

11 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 11 Stakk En stakk er en LIFO-kø (Last In First Out) import java.util.*; class Stakk { private LinkedList liste = new LinkedList(); public void settInnElement(Object objekt) { // ”push” liste.addLast(objekt); } public Object taUtElement() { // ”pop” return liste.removeLast(); } public int finnAntallElementer() { return liste.size(); } Gjør oppgaven side 567

12 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 12 Rekursjon Teknisk innebærer rekursjon at en metode kaller seg selv. For at dette ikke skal gjenta seg i det uendelige må enhver rekursjon ha et stoppkriterium. Eksempel: public int fakultet(int n) { if (n <= 1) return 1; // stopp-kriterium else return n * fakultet(n – 1); } Gjør oppgavene side

13 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 13 Trær Et tre er et spesialtilfelle av en graf –kan ikke inneholde sykluser –må henge sammen –alltid eksakt én vei mellom to noder –én node defineres som rot –treet brer seg ut fra rota –en hvilken som helst node kan defineres som rot tre ikke et tre

14 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 14 Nodene i et tre rot blad foreldrenoder barnenoder

15 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 15 Binære søketrær Et tre der hver forelder har maksimalt to barn kalles et binærtre. Barna utgjør roten i høyre og venstre subtre. Til hver node i treet hører det data. –det venstre barnet sine data er ”mindre eller lik” forelderens data –det høyre barnet sine data er ”større enn” forelderens data venstre subtre Vis programliste 17.4 side BinaertSoekeTre rot toString settInnVerdi søkEtterVerdi

16 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 16 Klassen SubTre SubTre høyreTre venstreTre forelder verdi toString settInnVerdi søkEtterVerdi Vis programliste 17.5 side Vis testprogrammet side

17 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 17 Binære søketrær i forhold til lenkede lister Søking etter data er mye raskere i et søketre enn i en lenket liste. –Søketiden i en lenket liste er i verste fall proporsjonal med antall elementer (= n) i listen. –Å søke i et binært søketre betyr å gå ned gjennom treet til vi finner rette objekt, eller vi når bunnen. Mye kortere! –Treet er balansert dersom det er mest mulig symmetrisk og rett. –Søket er mest effektivt dersom treet er balansert. –Det er mulig å vise at verst tenkelige søketid i et balansert tre er proporsjonal med log(n). –log(n) er alltid mindre enn n Å sette inn data tar lenger tid i et binært søketre enn i en liste. Gjør oppgaven side 576

18 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 18 Interface java.util.Map En avbildning (engelsk: map) ivaretar en kobling mellom nøkler og data. –Alle nøklene er forskjellige. –Hver nøkkel er koblet til eksakt én verdi. –Avbildningen skal gjøre det raskt å hente ut data når nøkkelverdien er gitt. Interface java.util.Map –Nøkler og data er objekter av vilkårlig type. –Dersom du forsøker å legge inn en nøkkelverdi som eksisterer fra før, vil nøkkelen knyttes til den nye dataverdien du legger inn. –Metoder: public Object get(Object nøkkel) public Object put(Object nøkkel, Object data) public Object remove(Object nøkkel)

19 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 19 Klassen java.util.TreeMap Klassen implementerer et binært søketre som holdes godt balansert Klassen implementerer Map, og også SortedMap: –public Object firstKey() –public Object lastKey() Nøklene må kunne sorteres –enten må en ”komparator” sendes inn som argument til konstruktøren, eksempel kollator fra side 301: TreeMap etTre = new TreeMap(java.text.Collator.getInstance()); –eller klassen som nøklene tilhører må implementere interfacet Comparable Eksempel, treet side 571 (lysbilde 15). –Tallene blir nøkler til nodene. –Vi lar dataene være personnavn.

20 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 20 Vi prøver TreeMap class TreeMapTest { public static void main(String[] args) { TreeMap treEksempel = new TreeMap(); treEksempel.put(new Integer(15), "Ole"); treEksempel.put(new Integer(10), "Ingrid"); treEksempel.put(new Integer(28), "Åse"); treEksempel.put(new Integer(3), "Beate"); treEksempel.put(new Integer(14), "Tove"); treEksempel.put(new Integer(20), "Petter"); treEksempel.put(new Integer(16), "Anders"); treEksempel.put(new Integer(21), "Toril"); System.out.println("Innholdet i treet: " + treEksempel.toString()); String test = (String) treEksempel.get(new Integer(11)); if (test == null ) System.out.println("11 finnes ikke"); else System.out.println("11 finnes: " + test); test = (String) treEksempel.get(new Integer(10)); if (test == null ) System.out.println("10 finnes ikke"); else System.out.println("10 finnes: " + test); System.out.println("Laveste nøkkelverdi: " + treEksempel.firstKey()); System.out.println("Høyeste nøkkelverdi: " + treEksempel.lastKey()); } Kjøring: Innholdet i treet: {3=Beate, 10=Ingrid, 14=Tove, 15=Ole, 16=Anders, 20=Petter, 21=Toril, 28=Åse} 11 finnes ikke 10 finnes: Ingrid Laveste nøkkelverdi: 3 Høyeste nøkkelverdi: 28 Gjør oppgaven side 578

21 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 21 Hashtabeller En hashtabell skiller seg fra –et binært søketre ved at elementene ikke har noen innbyrdes ordning –en lenket liste ved at søk går raskere Brukes bl.a. i mange operativsystemer til å holde rede på filene i en katalog Nøklene plasseres i bøtter Bøttene –er som oftest ordnet –duplikater ikke tillatt Søk og innsetting går raskt –beregn riktig bøtte –søk etter verdien i den relativt korte listen i bøtta, eller –sett inn verdien, for eksempel til slutt i listen Lastfaktoren er lik forholdet mellom antall elementer og antall bøtter. –høy lastfaktor: lang søketid, god plassutnyttelse –lav lastfaktor: kort søketid, plasskrevende, mange bøtter med få elementer hashfunksjon nøkkelverdibøtteverdi

22 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 22 Eksempel på hastabell Hashfunksjon: Plukk ut siste siffer i nøkkelverdien. bøttenr. Hver nøkkelverdi kan f.eks svare til opplysninger om en person. Disse dataene er ikke vist på figuren.

23 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 23 Klassen java.util.Hashtable Standardkonstruktøren lager 101 bøtter (lurt med primtall!). Rehashing foretas når lastfaktoren blir 0,75 –antall bøtter endres, og alle adresser beregnes på nytt Hver klasse kan ha sin egen hashfunksjon, hvis ikke arves implementasjonen av hashCode() fra klassen Object Klassen Hashtable implementerer interfacet Map med kjente metoder: –public Object get(Object nøkkel) –public Object put(Object nøkkel, Object data) –public Object remove(Object nøkkel)

24 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 24 Klassen som beskriver nøkkelen vist på lysbilde 22 class Ident { private int verdi; public Ident(int startVerdi) { verdi = startVerdi; } public int hashCode() { // Plukker ut siste siffer i tallverdien int potens = 10; while (verdi / potens > 10) potens *= 10; int rest = verdi % potens; while (rest > 10) { potens /= 10; rest %= potens; } System.out.println("Verdi " + verdi + " gir kode " + rest); // for testing return rest; } public String toString() { // nødvendig for at nøkkelen skal skrives ut riktig return "" + verdi; } public boolean equals(java.lang.Object obj) { // nødvendig for at søk skal bli riktig return ((Ident) obj).verdi == verdi; }

25 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 25 Klientprogram som lager og prøver hashtabellen class HashTest { public static void main(String[] args) { Hashtable hashEksempel = new Hashtable(10); // 10 bøtter for å passe med figuren hashEksempel.put(new Ident(2), "Ole"); hashEksempel.put(new Ident(11), "Ingrid"); hashEksempel.put(new Ident(16), "Åse"); hashEksempel.put(new Ident(18), "Beate"); hashEksempel.put(new Ident(31), "Tove"); hashEksempel.put(new Ident(35), "Petter"); hashEksempel.put(new Ident(55), "Anders"); hashEksempel.put(new Ident(85), "Toril"); hashEksempel.put(new Ident(94), "Tomas"); hashEksempel.put(new Ident(108), "Svein"); System.out.println("Innholdet i hashtabellen: " + hashEksempel.toString()); String test = (String) hashEksempel.get(new Ident(11)); if (test == null ) System.out.println("11 finnes ikke"); else System.out.println("11 finnes: " + test); test = (String) hashEksempel.get(new Ident(6)); if (test == null ) System.out.println("6 finnes ikke"); else System.out.println("6 finnes: " + test); } Utskrift: Verdi 2 gir kode 2 Verdi 11 gir kode 1 Verdi 16 gir kode 6 Verdi 18 gir kode 8 Verdi 31 gir kode 1 Verdi 35 gir kode 5 Verdi 55 gir kode 5 Verdi 85 gir kode 5 Verdi 94 gir kode 4 Verdi 108 gir kode 8 Innholdet i hashtabellen: {108=Svein, 18=Beate, 16=Åse, 85=Toril, 35=Petter, 55=Anders, 94=Tomas, 2=Ole, 11=Ingrid, 31=Tove} Verdi 11 gir kode 1 11 finnes: Ingrid Verdi 6 gir kode 6 6 finnes ikke

26 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else Lervik og Vegard B. Havdal, Stiftelsen TISIP og Gyldendal Akademisk Kapittel 17, side 26 Iteratorer En iterator hjelper oss å bla lineært gjennom en datastruktur Eksempel ArrayList liste = new ArrayList(); liste.add("a"); liste.add("b"); liste.add("c"); /*Fremgangsmåte 1 for å bla gjennom listen: */ Iterator i = liste.iterator(); while (i.hasNext()) { System.out.println(i.next()); } /*Fremgangsmåte 2 for å bla gjennom listen: */ for ( Iterator i2 = liste.iterator() ; i2.hasNext() ; ) { System.out.println(i2.next()); } Enumeration er et eldre (fremdeles mye brukt) alternativ til Iterator –metodenavn: hasMoreElements() og nextElement()


Laste ned ppt "Programmering i Java versjon desember 2002 Kun til bruk i tilknytning til læreboka ”Programmering i Java” skrevet av Else."

Liknende presentasjoner


Annonser fra Google