Lenkelister. Lister og køer.

Like dokumenter
Velkommen til INF1010

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

Versjon (vil bli endret).

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

Studieaktiviteter i INF1010

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

Vanlige datastrukturer. I dette lysarksettet

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

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

INF1010 siste begreper før oblig 2

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

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

Dagens tema INF1010 INF1010 INF1010 INF1010

INF1010 e-postadresser

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

Lenkelister og beholdere av lenkelister

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

INF1010. Stein Michael Storleer (michael) Lenkelister

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

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

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

2 Om statiske variable/konstanter og statiske metoder.

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

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

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

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

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

UNIVERSITETET I OSLO

INF1010 Binære søketrær ++

IN våren 2019 Onsdag 16. januar

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

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

Grunnleggende Datastrukturer

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

INF våren 2017

IN våren 2018 Tirsdag 16. januar

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

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

2 Om statiske variable/konstanter og statiske metoder.

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

Enkle generiske klasser i Java

Programmeringsspråket C Del 3

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

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)

Programmeringsspråket C Del 3

Programmeringsspråket C Del 3

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

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

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

Velkommen til. INF våren 2016

Velkommen til. INF våren 2017

Programmeringsspråket C Del 3

INF Notater. Veronika Heimsbakk 10. juni 2012

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

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

UNIVERSITETET I OSLO

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

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

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

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

INF Algoritmer og datastrukturer

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

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Introduksjon til objektorientert programmering

Algoritmer og Datastrukturer

INF Algoritmer og datastrukturer

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

UNIVERSITETET I OSLO

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

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

UNIVERSITETET I OSLO

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

INF Algoritmer og datastrukturer

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

Algoritmer og Datastrukturer

INF Objektorientert programmering. Datastrukturer i Java Klasser med parametre

INF1000 EKSTRATILBUD. Stoff fra uke 1-5 (6) 3. oktober 2012 Siri Moe Jensen

INF Innleveringsoppgave 6

Stack. En enkel, lineær datastruktur

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

INF1010 våren januar. Objektorientering i Java

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

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

UNIVERSITETET I OSLO

Obligatorisk oppgave 4: Lege/Resept

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

UNIVERSITETET I OSLO

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

Binær heap. En heap er et komplett binært tre:

INF1000 HashMap. Marit Nybakken 2. november 2003

IN1010 våren januar. Objektorientering i Java

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

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

Av Stein Gjessing, Institutt for informatikk, Universitetet i Oslo

Transkript:

Lenkelister. Lister og køer. INF1010 Stein Michael Storleer 27. januar 2011

Dagens forelesning Lenkede lister Lenkede lister Eksempel på en lenket liste: personliste Operasjoner på lenkede lister (enkeltlenket) Lister og køer Hva er en liste? FIFO- og LIFO-lister Datastrukturer Grafer (lister og trær) Objektorientert programmering Hvordan jobbe med INF1010 Forskjellige Studieaktiviteter Pensum Øvelser til neste fellesøvelse michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 2

Pekervariable og variable av primitive typer class Heltall { int t a l l ; Heltall ( int t ) { t a l l = t ; } } int a=0, b=7; Heltall refa, refb ; refa = new Heltall ( 0 ) ; refb = new Heltall ( 7 ) ; a = b; refa = refb ; b = 8; refb. t a l l = 8; System. out. println ( a, b, refa. t a l l, refb. t a l l ) ; michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 3

0 7 0 7 a b refa refb a = b; refa = refb; 7 7 7 a b refa refb b = 8; refb.tall = 8; 7 8 8 a b refa refb michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 4

Hva er en lenket liste? Jonathan Susanne Imran Nikita Adnan personliste Alle disse begrepene betegner det samme sammensatte objektet: pekerkjedeliste enkeltlenket liste pekerliste lenket liste lenkeliste linked list (vanligst på engelsk) chained list Objektene i lista har pekere for å referere til neste (evt. forrige) objekt. Slik bygges lista opp som en sammenhengende lenke av objekter ved hjelp av pekere. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 5

En første skisse av personlista. Først klassen som beskriver objektene (personene) som skal lenkes sammen. Deretter en klasse som beskriver selve lista. class Person { String navn ; Person nesteperson ; // andre attributter } class Personer { Person personliste ; //... } Lage en ny liste med personer: Personer minevenner = new Personer ; michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 6

Personobjektet Samme objekt (instans) av klassen Person tegnet på tre måter. Pekeren nesteperson kan peke på et objekt (instans) av samme klasse (evt. NULL). "Taher"... navn Taher Taher type: String nesteperson navn: navn type: Person navn: nesteperson michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 7

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 nesteperson String navn nesteperson String nesteperson String nesteperson String Jonathan Susanne Imran Nikita Elisabeth navn navn navn navn Person nesteperson String Figur: Objektdiagram av en personliste med 5 personer null personliste Et objekt av klassen Personer michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 8

Forenklet listeobjekt En instans av klassen Personer (med metoder) 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 Adnan personliste michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 9

Hvilke operasjoner trenger vi? sette inn en ny person finne en person fjerne en person bytte om to personer... class Personer { Person personliste ; } void setteinnperson ( Person inn ) { } ; void finneperson ( Person p ) { } ; void tautperson ( Person ut ) { } ; //... michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 10

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. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 11

Innsetting først (LIFO) void settinnpersonforst ( Person inn ) { \\ Hvis l i s t a er tom, sett inn objektet i f ( personliste == null ) personliste = inn ; else { \\ minst et objekt i l i s t a inn. nesteperson = personliste ; personliste = inn } } michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 12

Innsetting etter et bestemt objekt /* * Setter personobjektet i inn etter personobjektet e * Hverken i e l l e r e er NULL. * @param e Personobjektet som skal ha i som neste * @param i Personobjektet som skal inn etter e */ void settinnpersonetter ( Person e, Person i ) { i. nesteperson = e. nesteperson ; e. nesteperson = i ; } e i michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 13

Innsetting etter et bestemt objekt e i i. nesteperson = e. nesteperson ; e i michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 14

Innsetting etter et bestemt objekt e i e. nesteperson = i ; e i michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 15

Innsetting etter et bestemt objekt Strukturen etter at metoden er ferdig: Vi flytter litt på objektene: michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 16

Innsetting sist (FIFO) void settinnpersonsist ( Person inn ) { \\ Hvis l i s t a er tom, sett inn objektet først i f ( personliste == null ) personliste = inn ; else { \\ finne siste element i l i s t a Person p = personliste ; while ( p. nesteperson!= null ) p = p. nesteperson ; \\ her er p. nesteperson==null, altså er p siste p. nesteperson = inn } } michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 17

Peker til siste element i lista Person Person Person Person Person nesteperson String navn nesteperson String nesteperson String nesteperson String nesteperson String Jonathan Susanne Imran Nikita Elisabeth navn navn navn navn null Person personliste Person sisteperson Et objekt av klassen Personer Innsetting kan skje i to skritt. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 18

Tilleggskrav Eksempel på tilstandspåstander til lister: lista inneholder bare unike elementer lista er aldri tom lista har aldri mer enn k elementer objektene er alltid sortert Hjelper oss til å vite hvordan metodene som manipulerer lista skal virke, men kan også gjøre programmeringen mer omfattende. Kan være lurt å innføre ekstra struktur, tellere og pekere. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 19

Skrive ut alle personene i lista // I klassen Personer : void skrivalle ( ) { Person p = personliste ; while (p!= null ) { p. skriv ( ) ; p = p. nesteperson ; } } // I klassen Person : void skriv ( ) { System. out. println (... ) ; } michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 20

Eksempler på lister kandidatliste handleliste spillerliste sensurliste deltakerliste gjesteliste sjekkliste ordliste resultatliste... michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 21

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. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 22

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 også finnes regler for hvordan elementer kommer inn og tas ut av lista. På engelsk brukes ordet «queue» oftest om en FIFO-liste. («rettferdig kø») michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 23

Forskjellige implementasjoner av lister filer arrayer lenkede lister enkeltlenkede lister dobbeltlenkede lister med og uten listehode og -hale FIFO- og LIFO-køer (lister med regler) 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 enkeltlenkete lister. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 24

Lister er mer enn en mengde tellbarhet (endelig antall objekter) rekkefølge ikke nødvendigvis bare unike elementer hvor i lista kommer nye elementer (køregler) hvor tas elementer ut (køregler) Mengder implementeres likevel ofte som lister, men da slik at egenskapene over skjules. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 25

Lister med køregler køer inn ut ut FIFO (kø) Først inn først LIFO (stabel) Sist inn først ut michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 26 inn

FIFO First In First Out (kø) 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ø». (engelsk queue). Nyeste inn sist Eldste ligger først Eldste (første) er neste som betjenes (fjernes) Nyeste (siste) må vente lengst michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 27

LIFO Last In First Out (stabel) En LIFO-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, kan kalles en stabel (ref. tallerkenstabel), fordi elementet som kom sist ligger øverst og er det første til å tas ut. Muntlig brukes oftere det engelske stack. Nyeste inn først (øverst) Eldste ligger sist, bakerst (underst) Nyeste (øverste) er neste som betjenes (fjernes) Eldste (underste) må vente lengst michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 28

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 «øyeblikksbilder» av datastrukturen i et program gir et godt bilde av hva programmet gjør. Java datastruktur-tegninger er deler av et slikt bilde. Jf. eget notat om Java datastruktur. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 29

Alle programmer har en datastruktur enkeltvariable arrayer HashMap grafer (lister og trær mm.) Som hjelpemiddel under programmeringen er en skisse av (deler av) datastrukturen meget nyttig. Stein Gjessings notat handler om dette. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 30

Beholdere, mengder, programmer med en «database» Mange programmer skal holde orden på en relativt omfattende mengde objekter. Ofte betyr det lite hvordan objektene er organisert, så lenge programmet holder orden på dem. Vi benytter gjerne gjerne ferdiglagede datastrukturer for dette formålet, jf. HashMap. I dag skal vi se på datastrukturen lenket liste som også kan benyttes for å holde orden på mange objekter. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 31

Lenkede strukturer Når vi har en datastruktur der (mange) 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 med array og hashmap er at vi ikke trenger å ta stilling til antall objekter. I INF1010 skal vi nøye oss med å se på strukturene lister og binære trær som er de vanligste grafene i programmer. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 32

Valg av datastruktur array hashmap liste (fil) binærtre (søketre) annen grafstruktur Ethvert valg gir noen fordeler og noen ulemper. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 33

Objektorientering «alt» er objekter informasjonsskjuling innkapsling generiske typer arv og polymorfisme Husk at et objekt er en instans av en klasse michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 34

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. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 35

Studieaktiviteter i INF1010 Programmering (oppgaveløsning) alene/kollokvier programmeringslab (plenums)øvelser forelesninger ekstragruppe puslegruppe blogg selvstudium Husk INF1010 dreier seg først og fremst om å programmere. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 36

Pensum i INF1010 lysark fra forelesningene egne notater og programmer oppgaver og løsningsforslsag Java-bøker Internett Husk INF1010 dreier seg først og fremst om å kunne lage javaprogrammer. Å nøye seg med å programmere obliger er for de fleste ikke tilstrekkelig. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 37

Norsk og engelsk I INF1010 prøver vi på forelesningene å bruke norske begreper og navn på variable. Også på klasser og metoder som vi lager selv. Da blir det lett å skjønne hva vi har programmert selv (norsk) og hva som hører til Java språket eller APIet. Ulempen er at programmet blir vanskeligere å forstå for personer som ikke kan norsk. Noen liker heller ikke at vi bruker norsk når vi skriver programmer. michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 38

Oppgaver til plenumsøvelsen onsdag 1. skriv metodene finnperson(string navn), finnpersonfør(string navn), tautpersonetter(person p), tautnestsisteperson(),... 2. Utvid Personklassen med en int rang og innfør tilstandspåstanden at personene i lista er sortert etter rang i stigende rekkefølge. Skriv metoden settinnpersonetterrang. 3. Anta at personlista har listehode og hale. Gjør forenklinger i settinnpersonetterrang basert på denne antakelsen. 4. Lag en klasse LIFO-Personer etter modell av Personer-klassen med «LIFO-operasjonene»: settinnperson og tautperson. 5. Hvilken tilleggstruktur er nyttig hvis vi skal lage en tilsvarende FIFO-klasse? 6. Anta vi har en dobbeltlenket personliste. (Person er utvidet med en peker som peker på forrige Personobjekt i lista.) Gjør nødvendige forandringer i settinnpersonetterrang basert på dette. 7. 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 michael@ifi.uio.no INF1010 27. januar 2011 (uke 4) 39 etc.