Studieaktiviteter i INF1010

Like dokumenter
Dagens forelesning. INF1010 Datastrukturer Lister og køer Pekerkjedelister Øvelser. Innhold i dette lysarksettet

Operasjoner på lenkede lister (enkeltlenket) Eksempel på en lenket liste: personliste. INF januar 2010 (uke 3) 2

Velkommen til INF1010

Lenkelister. Lister og køer.

Versjon (vil bli endret).

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

Vanlige datastrukturer. I dette lysarksettet

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

INF1010. Om pensum INF1010 INF1010 INF1010 INF1010. Det vesentlige er å forstå og kunne lage programmer ved hjelp av eksemplene i bøkene.

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

Dagens tema INF1010 INF1010 INF1010 INF1010

INF1010 siste begreper før oblig 2

Lenkelister, iteratorer, indre klasser. Repetisjonskurs våren 2018 kristijb

INF1010 e-postadresser

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

Rekursjon. Binærsøk. Hanois tårn.

Lenkelister og beholdere av lenkelister

UNIVERSITETET I OSLO

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

Dagens temaer. Sortering: 4 metoder Søking: binærsøk Rekursjon: Hanois tårn

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

klassen Vin må få en ny variabel Vin neste alle personvariable (personpekere) i listeklassen må byttes til Vin

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

INF1010. Stein Michael Storleer (michael) Lenkelister

UNIVERSITETET I OSLO

Grunnleggende Datastrukturer

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

UNIVERSITETET I OSLO

Innhold. INF1000 Høst Unified Modeling Language (UML) Unified Modeling Language (UML)

Løsningsforslag for Obligatorisk Oppgave 3. Algoritmer og Datastrukturer ITF20006

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Enkle generiske klasser i Java

Liste som abstrakt konsept/datatype

1- og 2-veis Innkapsling Java Stabel Kø Prio-kø Iterator. Enveis- og toveislister Innkapsling («boxing») (Big Java 6.8.5)

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

Hva er en kø? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn først

UNIVERSITETET I OSLO

Finne et personobjekt med et gitt navn. Sette personobjekt inn i treet

UNIVERSITETET I OSLO

Introduksjon til objektorientert programmering

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

UNIVERSITETET I OSLO

Programmeringsspråket C Del 3

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

UNIVERSITETET I OSLO

Innhold uke 10. Objektorientert programmering i Python. Oblig 7 og 8. IN1000 Seminar! IN1000 Høst 2018 uke 10 Siri Moe Jensen

INF1010 våren januar. Objektorientering i Java

Programmeringsspråket C Del 3

Stack. En enkel, lineær datastruktur

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Algoritmer og Datastrukturer

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

INF Notater. Veronika Heimsbakk 10. juni 2012

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

IN1010 våren januar. Objektorientering i Java

UNIVERSITETET I OSLO

INF1010 notat: Binærsøking og quicksort

Introduksjon til objektorientert. programmering. Hva skjedde ~1967? Lokale (og globale) helter. Grunnkurs i objektorientert.

2 Om statiske variable/konstanter og statiske metoder.

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

Løsnings forslag i java In115, Våren 1996

Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

INF1010 UML. Marit Nybakken 26. januar 2004

Sudokubrettet Et sudokubrett består av n n ruter. Vi bruker følgende begreper i oppgaven:

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

Hva er en liste? Hvert element har en forgjenger, unntatt første element i listen. Hvert element har en etterfølger, unntatt siste element i listen

INF1000: noen avsluttende ord

INF1000 HashMap. Marit Nybakken 2. november 2003

Quicksort. Fra idé til algoritme.

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Enkle datastrukturer. Lars Greger Nordland Hagen. Introduksjon til øvingsopplegget og gjennomgang av python

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

Objektorientert design av kode. Refaktorering.

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

INF1000: Forelesning 6. Klasser og objekter del 1

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

Løsnings forslag i java In115, Våren 1998

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Lenkelister og beholdere av lenkelister

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Transkript:

Innhold i dette lysarksettet Dagens forelesning INF1010 Innhold i dette lysarksettet Hvordan jobbe med INF1010 Datastrukturer Algoritmer og datastrukturer Grafer (lister og trær) Objektorientert programmering Lister og køer Hva er en liste? Forskjellige implementasjoner av lister FIFO- og LIFO-lister Pekerkjedelister Pekerkjedelister Øvelser Øvelser til neste fellesøvelse Hvordan jobbe med INF1010 Vi anbefaler et par bøker I tillegg et notat om binærsøk og quicksort. Disse brukes som referanselitteratur for temaene som behandles. Pensum framgår av lysarkene som brukes på forelesningene. Læringsmålet i INF1010 er ikke å kunne et pensum, men å kunne lage programmer (rimelig raskt) ved å bruke programmeringsteknikker som innøves i de forskjellige studieaktivitetene. Det er viktig å vite at man ikke kan lese seg til å nå dette målet. Hvordan jobbe med INF1010 Studieaktiviteter i INF1010 Programmering (oppgaveløsning) alene/kollokvier programmeringslab (felles)øvelser forelesninger selvstudium lysark fra forelesningene egne notater og programmer oppgaver og løsningsforslsag Java-bøker Internett o.l. Husk INF1010 dreier seg først og fremst om å kunne lage javaprogrammer. Algoritmer og datastrukturer Ethvert program har en datastruktur som data manipuleres og lagres i. Programmet (algoritmene) virker på datastrukturen og endrer den. Datastrukturen endrer seg under programutførelsen. Å lage et «øyeblikksbilde» av datastrukturen i et program gir et godt bilde av hva programmet gjør. Objektdiagrammer er deler av et slikt bilde.

Algoritmer og datastrukturer Alle programmer har en datastruktur array HashMap grafer (lister og trær mm.) Som hjelpemiddel under programmeringen er en skisse av (deler av) datastrukturen meget nyttig. UML-diagram klassediagram objektdiagram strukturskisser annen skisse eller figur Grafer (lister og trær) Pekerstrukturer Når vi har en datastruktur der objekter referer (peker på) andre objekter, får vi en graf. I hvert objekt kan vi ha mange pekere, og vi kan lage så komplekse grafer (nettverk) vi ønsker. En fordel med grafer sammenlignet I INF1010 skal vi nøye oss med å se på strukturene lister og binære trær som er de vanligste grafene i programmer. Algoritmer og datastrukturer Beholdere (containers) I mange typer programmer betyr det lite hvordan dataene er organisert, så lenge vi kan oppbevare et objekt, sette det inn, finne det og fjerne det fra mengden av objekter, er vi fornøyd. Vi benytter da gjerne ferdiglagede programmoduler, jf. HashMap. Det skal vi ikke gjøre i dag. Istedet skal vi se på et eksempel på hvordan vi lager en konkret beholder for personer, en personliste. Grafer (lister og trær) Valg av datastruktur Et viktig valg i programutviklingen er valg av datastruktur. Har vi mange objekter og det ikke er så viktig hvordan disse struktureres seg imellom, er det vanligvis aktuelt å velge en eller annen form for beholder: array hashmap liste (fil) tre annen grafstruktur

Objektorientert programmering Objektorientering «alt» er objekter informasjonsskjuling innkapsling generiske typer arv og polymorfisme et objekt er en instans av en klasse Hva er en liste? Eksempler på lister På norsk bruker vi vanligvis ordet «liste» for en oppramsing (gjerne vertikal) på et stykke papir e.l. kandidatliste handleliste spillerliste sensurliste deltakerliste gjesteliste sjekkliste ordliste resultatliste... Objektorientert programmering Perspektiv Husk perspektivet. Man kan ikke se alt med ett blikk. I en sammensatt datastruktur med mange objekter, er det fruktbart å skifte perspektiv fra det detaljerte, til det mer generelle, og tilbake. F.eks. vil vi noen ganger betrakte enkeltelementene i en liste som enkeltobjekter, andre ganger vil vi betrakte hele lista med tilhørende operasjoner som ett objekt. Begge måter er objektorienterte, men perspektivet skifter. Hva er en liste? Lister er en sekvensiell datastruktur Vi bruker liste om en struktur som har en sekvensiell form. I programmering er lister den vanligst forekommende datastruktur. Alle sekvensielle data (i en array f.eks.) kan kalles en liste. En fil kan ses på som en liste av tekststrenger (linjer). En tekststreng er igjen en liste av tegn. En fil kan derfor ses på som en liste av lister av tegn.

Hva er en liste? Vi bruker flere ord for å betegne lister og mer bestemte typer av lister. Det viktigste ved en liste, er at det innebærer en ordning av objektene etter hverandre i sekvens, slik at man fra et element kan finne det neste (eller forrige). sequence list stack (LIFO) queue (FIFO) Med en kø forstår vi en liste hvor det finnes regler for hvordan elementer kommer inn og tas ut av lista. På engelsk brukes ordet «queue» oftest om en FIFO-liste. («rettferdig kø») Forskjellige implementasjoner av lister Lister er mer enn struktur tellbarhet rekkefølge bare unike elementer sortering av elementene hvor i lista kommer nye elementer (køregler) hvor tas elementer ut (køregler) Forskjellige implementasjoner av lister filer arrayer lenkede lister enkeltkjedete lister dobbeltkjedete lister med og uten listehode og -hale FIFO- og LIFO-køer Du vil lære mer om de forskjellige implementasjonene ved å løse oppgavene som blir gitt til neste fellesøvelse. Programmeringseksemplene i denne forelesningen begrenser seg til enkeltkjedete lister. FIFO- og LIFO-lister FIFO First In First Out (queue) En FIFO-liste er en kø som har køregler som en «billettkø». Elementene rangeres etter hvor lang tid de har «stått i køen», slik at den står for tur som har stått lengst. En liste som administreres slik, kalles også «rettferdig kø». Eller bare «kø». Nyeste inn sist Eldste ligger først Eldste (første) er neste som betjenes (fjernes) Nyeste (siste) må vente lengst

FIFO- og LIFO-lister LIFO Last In First Out (stack) En FIFO-liste er en «kø» som har omvendte køregler i forhold til en FIFO-liste. Elementene rangeres etter hvor lang tid de har «stått i køen», slik at den står for tur som kom inn i køen sist. En liste som administreres slik, kalles også en «stabel», fordi elementet som kom sist ligger øverst og er det første til å tas ut. Nyeste inn først (øverst) Eldste ligger sist, bakerst (underst) Nyeste (øverste) er neste som betjenes (fjernes) Eldste (underste) må vente lengst En første skisse av personlista. Først klassen som beskriver objektene (personene) som skal lenkes sammen. Deretter en klasse som beskriver selve lista. 1 class Person { 2 navn; 3 Person ; 4 // andre attributter 5 } 6 7 class Personer { 8 Person personliste ; 9 //... 10 } Lage en ny liste med personer: 1 Personer minevenner = new Personer ; Pekerkjedelister Hva mener vi med en pekerkjedeliste Alle disse begrepene betegner det samme sammensatte objektet (en beholder): kjedet liste pekerliste lenkeliste linked list (Weiss) chained list Objektene i lista har pekere for å referere til neste (evt. forrige) objekt. Slik bygges lista opp som en sammenhengende kjede av objekter ved hjelp av pekere. Personobjektet Hvert element (objekt) i lista har en peker til det neste elementet i lista, bortsett fra siste elementet som peker til null. type: navn: navn type: Person "Sokrates" Sokrates Forenklet objekt navn: neste Et objekt av klassen Person

Et listeobjekt En instans av klassen Personer og de objektene (instanser av klassen Person) som er tilgjengelige fra den, dvs som programmet kan nå ved å følge pekerne. Person Person Person Person Person navn Jonathan Susanne Imran Nikita Elisabeth navn navn navn navn Person Figur: Objektdiagram av en personliste med 5 personer null personliste Et objekt av klassen Personer Hvilke operasjoner trenger vi? sette inn en ny person finne en person fjerne en person bytte om to personer... Programskisse av listeklassen (husk perspektiv): 1 class Personer { 2 Person personliste ; 3 4 void setteinnperson ( Person inn ) { } ; 5 void finneperson ( Person p ) { } ; 6 void tautperson ( Person ut ) { } ; 7 //... 8 } Forenklet listeobjekt En instans av klassen Personer og de objektene (instanser av klassen Person) som er tilgjengelige fra den, dvs som programmet kan nå ved å følge pekerne. Jonathan Susanne Imran Nikita Elisabeth null personliste Jonathan Susanne Imran Nikita Elisabeth null personliste Innsetting først sist sortert etter en attributtverdi prioritet tid i lista Før vi kan bestemme det, må vi vite hvordan lista skal administreres? F.eks. om den skal være FIFO eller LIFO. Hvis vi ikke vet det, kan vi lage flere innsettingsmetoder.

Innsetting først 1 void settinnpersonforst( Person inn ) { 2 \\ Hvis l i s t a er tom, sett inn objektet 3 i f ( personliste == null ) personliste = inn ; 4 else { 5 \\ minst et objekt i lista 6 inn. = personliste ; 7 personliste = inn 8 } 9 } Et listeobjekt med peker til siste element i lista Person Person Person Person Person navn Jonathan Susanne Imran Nikita Elisabeth navn navn navn navn null Person Person personliste sisteperson Et objekt av klassen Personer Innsetting sist (uten «sistepeker») 1 void settinnpersonsist( Person inn ) { 2 \\ Hvis l i s t a er tom, sett inn objektet 3 i f ( personliste == null ) personliste = inn ; 4 else { 5 \\ finne siste element i lista 6 Person p = personliste ; 7 while (p.! = null ) 8 p = p. ; 9 \\ her er p. ==null, altså er p siste 10 p. = inn 11 } 12 } Innsetting og holde sortert Antar at Person-objektene i lista har et attributtint rang som objektene er sortert etter i stigende rekkefølge. Elementet som skal inn må da ikke havne så langt ut i lista at det får et element med høyere verdi på rang før seg selv. Vi leter oss fram til en tom nestepeker, eller til peker på et objekt med høyere rang. Dette synes ganske enkelt, men vi vil se at når metoden skal virke både for en tom og en ikke-tom liste og for en liste som bare har et objekt, blir det nokså omstendelig. personliste == null innobjektet skal inn først innobjektet skal inn sist innobjektet skal hverken først eller sist

1 void settinnpersonetterrang( Person inn ) { 2 Person p = personliste ; 3 Boolean fortsett = true ; 4 inn. = null ; // hvorfor? 5 while (p!= null && fortsett ) 6 if (p.!= null && p.. rang < inn. rang ) 7 p = p. ; 8 else fortsett = false ; 9 //p == null eller p.. rang >= inn.rang 10 if (p == null ) { 11 // lista var tom 12 personliste = inn ; 13 } 14 else if (p == personliste ) { 15 if (p.rang < inn. rang ) { 16 inn. = p. ; 17 personliste = inn ; 18 } 19 else { 20 inn. = personliste ; 21 personliste = inn ; 22 } 23 } 24 else { 25 // inn skal inn mellom p og p. 26 inn. = p. ; 27 p. = inn ; 28 } 29 } Fjerne person med gitt rang (en instans eller ingen) 1 Person fjern ( int rang) { 2 Person p = personliste ; 3 Person forrige = null ; 4 while (p!= null && p. rang!= rang { 5 forrige = p; 6 p = p. ; 7 } 8 // p er personen som skal fjernes, 9 // forrige er personen FØR denne i lis te n 10 if (p!= null ) { 11 i f (p == personliste ) { 12 // Spesialtilfelle : p som skal fjernes står først 13 personliste = personliste. ; 14 } else { 15 forrige. = p. ; 16 } 17 } 18 return p; 19 } Skrive ut alle personene i lista 1 // I klassen Personer : 2 3 void skrivalle ( ) { 4 Person p = personliste ; 5 while (p! = null ) { 6 p. skriv ( ) ; 7 p = p. ; 8 } 9 } 10 11 // I klassen Person : 12 void skriv ( ) { 13 System. out. println (... ) ; 14 } Øvelser til neste fellesøvelse Oppgaver Hvis du ikke har mulighet til å programmere alt, lag enkle programskisser. Oppgave 4 er fort gjort. 1. Finn feil i settinnpersonetterrang, eller overbevis deg selv om at den alltid virker korrekt. 2. Anta at personlista har listehode og hale. Gjør forenklinger i settinnpersonetterrang basert på denne antakelsen. 3. Lag en klasse LIFO-Personer etter modell av Personer-klassen med «LIFO-operasjonene»: settinnperson og tautperson. 4. Hvilken tilleggstruktur er nyttig hvis vi skal lage en tilsvarende FIFO-klasse? 5. Anta vi har en dobbeltkjedet personliste. (Person er utvidet med en peker som peker på forrige Personobjekt i lista. Gjør nødvendige forandringer i settinnpersonetterrang basert på dette. 6. Vi innfører arrayen personarray Person[400] i Personer. Lag en metode som overfører en FIFO-liste fra personliste til denne arrayen. Skriv metodene for å ta ut og sette personobjekter inn i personarrayen. Hint: Istedet for pekere bruker vi nå indekser i arrayen for første, neste, siste etc.