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

Like dokumenter
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

Liste som abstrakt konsept/datatype

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

Definisjon: Et sortert tre

Definisjon av binært søketre

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

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

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

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

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

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

PG4200 Algoritmer og datastrukturer Forelesning 7

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

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

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Datastrukturer for rask søking

UNIVERSITETET I OSLO

Stack. En enkel, lineær datastruktur

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

Læringsmål for forelesningen

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

... Når internminnet blir for lite. Dagens plan: Løsning: Utvidbar hashing. hash(x) katalog. O modellen er ikke lenger gyldig ved

INF1010. Stein Michael Storleer (michael) Lenkelister

Dagens tema INF1010 INF1010 INF1010 INF1010

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

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

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

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

UNIVERSITETET I OSLO

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

Binære trær: Noen algoritmer og anvendelser

Grunnleggende Datastrukturer

Flerveis søketrær og B-trær

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

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

Inf 1020 Algoritmer og datastrukturer

Et eksempel: Åtterspillet

AlgDat 12. Forelesning 2. Gunnar Misund

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

Oppgave 1. Sekvenser (20%)

Selv-balanserende søketrær

Et eksempel: Åtterspillet

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

EKSAMEN I FAG TDT4100 Objekt-orientert programmering. Fredag 3. juni 2005 KL

UNIVERSITETET I OSLO

Faglærerne prøver å besøker eksamenslokalet mellom klokka 15 og 16 for å oppklare eventuelle uklarheter og feil i oppgaveteksten.

Hvor raskt klarer vi å sortere?

Dagens plan: INF Algoritmer og datastrukturer. Repetisjon: Binære søketrær. Repetisjon: Binære søketrær

UNIVERSITETET I OSLO

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

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

Algoritmer og Datastrukturer

INF Notater. Veronika Heimsbakk 10. juni 2012

IN1010 våren januar. Objektorientering i Java

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

Hashing: Håndtering av kollisjoner

INF1010, 21. februar Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Velkommen til INF1010

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

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

Lenkelister. Lister og køer.

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

Oppsummering del 2. Læringsmål Viktigste Java-elementer Eksamen Til sist. Læringsmål Hovedpunkter Tilbakemelding Eksamen. IN1010 uke 17 våren 2019

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

Vi skal se på grafalgoritmer for:

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer E Løkker i Java

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.3

PG 4200 Algoritmer og datastrukturer Innlevering 2

Algoritmer og Datastrukturer IAI 21899

Sist gang (1) IT1101 Informatikk basisfag. Sist gang (2) Oppgave: Lenket liste (fysisk) Hva menes med konseptuelt og fysisk i forb med datastrukturer?

Versjon (vil bli endret).

Algoritmer og Datastrukturer

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

INF2220: Time 4 - Heap, Huffmann

INF1010 Binære søketrær ++

EKSAMEN. Emne: Algoritmer og datastrukturer

Kap 9 Tre Sist oppdatert 15.03

EKSAMEN. Algoritmer og datastrukturer. Eksamensoppgaven: Oppgavesettet består av 11 sider inklusiv vedlegg og denne forsiden.

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

UNIVERSITETET I OSLO

IN Algoritmer og datastrukturer

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

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

INF1010 siste begreper før oblig 2

EKSAMEN Løsningsforslag. med forbehold om bugs :-)

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

INF1000 HashMap. Marit Nybakken 2. november 2003

INF Algoritmer og datastrukturer

København 20 Stockholm

Transkript:

Lister

Hva er en liste? Listen er en lineær datastruktur Hvert element har en forgjenger, unntatt første element i listen Hvert element har en etterfølger, unntatt siste element i listen I motsetning til stack og kø, har vi tilgang til alle elementer i en liste Vi kan sette inn, fjerne og søke etter elementer i hele listen

Tre ulike typer av lister Ordnede lister Elementene ligger i sortert rekkefølge, basert på en innbyrdes sammenligning av elementenes verdi Uordnede lister Elementene ligger i en eller annen rekkefølge, men denne avhenger ikke av elementenes verdi Indekserte lister Hvert element har et entydig nummer (0, 1,..., n 1) som kan brukes til direkte oppslag i listen

Vanlige operasjoner på en liste removefirst Fjern første element i listen removelast remove Fjern siste element Fjern et bestemt element first, last Se på første/siste element contains isempty size add... Søk etter et bestemt element Sjekk om listen er tom Antall elementer i listen Innsetting av ny verdi, løses på ulike måter for ordnet og uordnet liste

Grensesnitt for en liste-adt i Java * public interface ListADT<T> extends Iterable<T> { public T removefirst(); public T removelast(); public T remove(t element); public T first(); public T last(); public boolean contains(t target); public boolean isempty(); public int size(); public Iterator<T> iterator(); } * Som i læreboken

Iterator? Java-metode som returnerer et Iterator-objekt Brukes til å gå gjennom en hel datastruktur på en eller annen systematisk måte typisk fra første til siste element for en liste med detaljene skjult Viktigste Iterator - metoder: hasnext: Sjekker om det er flere elementer å gå gjennom next: Returnerer neste element i gjennomgangen De fleste Java-collections har en eller flere iteratormetoder implementert og de kan være litt skumle Se kapittel 7 og koden i læreboka for mer om iteratorer

Typisk bruk av en iterator ArrayList<String> L = new ArrayList<String>(); [... ] Iterator itr = L.iterator(); while( itr.hasnext() ) { String S = (String) itr.next(); System.out.println(S); }

Innsetting av nytt element i uordnet liste Uordnet: Kan sette inn elementer hvor som helst i listen Læreboken implementerer tre metoder for innsetting: addtofront Legger til nytt element først i listen addtorear addafter Legger til nytt element sist i listen Legger til nytt element etter et bestemt element i listen

ADT for uordnet liste public interface UnorderedListADT<T> extends ListADT<T> { public void addtofront(t element); } public void addtorear(t element); public void addafter(t element, T target);

Innsetting nytt element i ordnet liste Ordnet liste: Kan ikke sette inn slik at sorteringen ødelegges Listen må selv sørge for dette Tilbyr derfor kun én add - metode for å sette inn elementer Elementene i en ordnet liste må kunne sammenlignes med hverandre for å bestemme sorteringen: I Java løses dette ved å kreve at alle elementer i listen tilhører subklasser av datatypen Comparable Dette ligger ikke i ADT'en, men sjekkes i stedet av add metoden i de ulike implementasjonene av ordnet liste

ADT for ordnet liste public interface OrderedListADT<T> extends ListADT<T> { public void add(t element); }

Eksempel på bruk av ordnet liste: Oppsett av en turnering Et antall lag skal spille en cup/utslags-turnering Sett opp første runde i turneringen slik at: Beste lag møter dårligste lag Nest beste lag møter nest dårligste lag, etc. Input: Antall lag, må være en potens av 2: 4, 8, 16, 32, Navn på hvert lag En rangering av hvert lag, i form av antall kamper vunnet

Turnering: Implementasjon Egen klasse for lagene som implementerer Comparable: Inneholder lagets navn og antall kamper vunnet Leser inn antall lag og data for hvert lag fra bruker Legger alle lag i en liste sortert på antall kamper vunnet Gå i en løkke inntil listen er tom: Ta ut første og siste element/lag i listen Skriv ut at disse to lagene skal spille mot hverandre Java-program: TournamentMaker.java

Lister implementert med array Bruker en array av referanser til objekter Fast initiell lengde på array, utvider når nødvendig Begynnelsen på listen er alltid i indeks 0 (null) Unødvendig å bruke sirkulær array som for køer Vi må uansett flytte elementer, fordi fjerning og innsetting ikke bare kan skje i endene av listen Trenger bare å lagre antall elementer i listen i tillegg til selve arrayen Kode fra læreboka: ArrayList.java

Lister implementert med array

Liste med array: Fjerning av element Tre metoder: public T removefirst(); public T removelast(); public T remove(t element); Fjerning av siste element er trivielt, O(1) Fjerning av første element eller et element inne i listen krever at alle elementer etter det som er fjernet flyttes en plass til venstre for å unngå et tomt hull i arrayen remove krever i tillegg et søk (intern metode find) Fjerning blir derfor generelt en O(n)-operasjon for en array-liste med n elementer

Liste med array: Søke etter element Metode: public boolean contains(t target); Læreboka bruker her samme interne metode find som for fjerning av et bestemt element i listen Søking er en O(n)-operasjon for uordnet array-liste med n elementer, fordi vi i verste fall må gå gjennom hele listen Søking kan implementeres som en O(log n) operasjon for sorterte array-lister, hvis vi bruker binærsøk* *: Beskrevet i kapittel 9 i læreboka

Liste med array: Innsetting av element i uordnet liste Tre metoder: public void addtofront(t element); public void addtorear(t element); public void addafter(t element, T target); Innsetting sist i listen er trivielt, O(1) Innsetting først eller inne i listen krever at alle elementer etter det nye først flyttes en plass til høyre addafter krever i tillegg et søk for å finne posisjonen Innsetting blir generelt en O(n)-operasjon Kode fra læreboka: ArrayUnorderedList.java

Liste med array: Innsetting av element i ordnet liste Metode: public void add(t element); Må gå gjennom array fra begynnelsen inntil vi finner posisjonen/indeksen der nytt element skal inn Deretter må alle elementer etter det nye flyttes en plass til høyre, før nytt element settes inn riktig Innsetting er en O(n)-operasjon for en ordnet arrayliste med n elementer Kode fra læreboka: ArrayOrderedList.java

Lenkede datastrukturer Et alternativ til array-baserte implementasjoner er å bruke lenkede datastrukturer En lenket datastruktur i Java bruker objektreferanser til å lage lenker (eller forbindelser) mellom objektene Variabler i Java som lagrer referanser til objekter inneholder egentlig minneadressen til dataene som utgjør objektet (kalles pekere i språk som f.eks. C)

Eksempel: Lenket datastrukturer Data om personer lagres i objekter av en Java-klasse Person Hvert objekt inneholder også en referanse til et annet Person-objekt En sekvens av Person-objekter kan danne en lineær datastruktur som kalles en lenket liste Objektene i en slik datastruktur kalles noder

Ikke-lineære lenkede datastrukturer Hvis hver node inneholder flere referanser til andre noder, kan de lenkes sammen til å danne mer kompliserte ikke-lineære datastrukturer I dette kurset skal vi senere se på de ikke-lineære datstrukturene trær og grafer

Lenket liste Lenkede lister har ingen indekser for direkte oppslag Det er bare en referanse til noden i starten på listen For å aksessere hvert element i listen må vi følge referansene fra en node til neste node: Person current = first; while (current!= null) { System.out.println(current); current = current.next; }

Håndtering av lenker Operasjoner på lenkede lister må være nøyaktige, og sikre at referanser/pekere er korrekte og konsistente For f.eks. å sette inn en ny node først i listen: 1. Sett ny node til å peke på nåværende første node 2. Sett starten på listen (front) til å peke på den nye noden

Håndtering av lenker forts. Tilsvarende, for å fjerne første node: Flytt pekeren til starten på listen (front) til å referere til nåværende første node sin etterfølger / neste. Hvis noden som fjernes skal brukes senere, må det tas vare på en referanse til noden før front -pekeren flyttes, hvis ikke er den å regne som fjernet fra hukommelsen

Generiske lenkede lister Vi ønsker å lage generelle datastrukturer der koblingene/ referansene mellom nodene er uavhengige av dataene som skal lagres i strukturen Løsning: Bruk en egen node-klasse som bare inneholder: En referanse til neste node i listen (null for siste node) En generisk referanse til objektet som er lagret i listen Java-kode fra læreboka: LinearNode.java

Implementasjon av lenkede lister Bruker noder av typen LinearNode, med én referanse til neste node og én til selve listeobjektet, Klassen som representerer en lenket liste inneholder: Referanse til første node i listen: head Referanse til siste node i listen: tail Antall elementer i listen: count Kode fra læreboka: LinkedList.java

Lenket liste: Fjerning av element Tre metoder: public T removefirst(); public T removelast(); public T remove(t element); Fjerning av første element er enkelt, O(1) Fjerning av siste element eller et element inne i listen: Traversér listen for å finne noden før den som skal fjernes Fjern elementet ved å sette neste-pekeren til forgjengernoden til å peke på fjernet node sin etterfølger Implementasjon er fiklete, må håndtere spesialtilfeller Fjerning er generelt en O(n)-operasjon

Fjerning av element i lenket liste

Lenket liste: Søke etter element Metode: public boolean contains(t target); Må alltid gå fra begynnelsen av listen og sammenligne med en og en node inntil vi evt. finner target Verste tilfelle er n steg, gjennomsnittlig n/2 Søking i en lenket liste med n elementer er O(n) Kan ikke effektiviseres, selv om listen er sortert Men: Hvis vi innfører to neste-pekere i hver node, kan vi lage en ordnet datastruktur som har O(log n) oppførsel for innsetting, fjerning og søking(!) et binært søketre* * Lærebokas kapittel 11

Lenket liste: Innsetting av element i uordnet liste Tre metoder: public void addtofront(t element); public void addtorear(t element); public void addafter(t element, T target); Innsetting først eller sist er trivielt, O(1) addafter krever at listen traverseres fra begynnelsen for å finne ut hvor ny node skal plasseres Selve innsettingen er litt fiklete, må oppdatere forgjenger Innsetting inne i listen med addafter er O(n) Kode fra læreboka: LinkedUnorderedList.java

Innsetting av element i lenket liste

Lenket liste: Innsetting av element i ordnet liste Metode: public void add (T element); Krever at listen traverseres fra begynnelsen for å finne ut hvor ny node skal plasseres Innsettingen er litt fiklete, må oppdatere forgjenger Innsetting er generelt O(n) for en sortert lenket liste med n elementer Kode fra læreboka: LinkedOrderedList.java

Vanlige varianter av lenket liste Liste med hode (og hale ): Egen dummy (aka sentinel / vaktpost ) node for begynnelsen (og evt. slutten av listen) Slipper unna noen spesialtilfeller ved innsetting og fjerning, fordi listen aldri er tom Sirkulære lister: Siste node peker til første

Dobbeltlenkede lister Hver node har peker både til neste og til forrige node Enklere koding av innsetting og fjerning Kan traverseres forlengs og baklengs Typisk anvendelse: Redigering av en linje med tekst Implementasjon: DoubleNode.java DoubleList.java

Dobbeltlenket liste

Indekserte lister Har samme metoder som en vanlig liste Tilbyr i tillegg metoder for å se på, sette inn og fjerne elementer på en bestemt posisjon (eller indeks) i listen Indeksene til elementer i listen vil oftest endres ved innsetting og fjerning En indeksert liste er vanligvis ikke ordnet (hvorfor?) Indekserte lister er implementert i Java Collections

Indeksert liste

Lister i Java Collections API Generell liste-adt: java.util.list Tre ulike implementasjoner av lister i Java: Array-liste: java.util.vector (synkronisert) Array-liste: java.util.arraylist (ikke synkronisert) Lenket liste: java.util.linkedlist (ikke synkronisert) Alle tre implementerer indekserte lister Java-listene inneholder også metoder som implementerer stack og ulike typer køer

Noen metoder fra java.util.list som implementerer indekserte lister Metode add(int index, E element) get(int index) remove(int index) set(int index, E element) Beskrivelse Setter inn element på gitt indeks Returnerer element på gitt indeks Fjerner element på gitt indeks Erstatter element på gitt indeks

En anvendelse av indekserte lister: Josephus' problem 2000 år gammel historie, se Wikipedia Animasjon:

Josephus' problem som en liste Input: Liste med tallene 1, 2, 3,, n Ta ut (f.eks.) hvert tredje element fra en liste, inntil bare ett element står igjen Eksempel med n = 7: 1 2 3 4 5 6 7 1 2 4 5 6 7 1 2 4 5 7 1 4 5 7 1 4 5 1 4 4

Implementasjon av Josephus' problem Bruker en indeksert liste til å lagre tallene Listen behandles som om den var sirkulær vi går til begynnelsen når vi kommer til slutten av listen ved å bruke enkel modulus-regning Vi må ta hensyn til at at listen kollapser mens vi er i gang, og hele tiden holde rede på indeksen til neste element som skal ut

Algoritme for Josephus' problem* Input: n d f Antall elementer Avstand mellom elementene som fjernes Første element som skal fjernes 1 Legg inn tallene 1,2,3,n i en indeksert liste L 2 Sett indeks til første element som fjernes: p = f 1 3 Så lenge n > 1 3.1 Fjern elementet på indeks p i listen 3.2 n = n 1 3.3 p = (p + d 1) % n Implementasjon: Josephus_2.java * Litt anderledes enn koden i læreboka

Lister: Oppsummering av effektivitet Array-liste: Fordeler: Enkel implementasjon Innsetting og fjerning sist i listen er O(1) Direkte oppslag, O(1) Søking i ordnet liste kan være O(log n) Ulemper: Innsetting og fjerning først og inne i liste O(n) Lenket liste: Fordeler: Innsetting først og sist O(1) Fleksibel, flere varianter Ulemper: Fiklete implementasjon Ikke direkte oppslag Søking, innsetting og fjerning inne i liste O(n)