Liste som abstrakt konsept/datatype

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

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

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

Definisjon av binært søketre

PG4200 Algoritmer og datastrukturer Forelesning 5 Implementasjon av lister

Definisjon: Et sortert tre

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

PG4200 Algoritmer og datastrukturer Forelesning 7

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

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

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

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)

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

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Datastrukturer for rask søking

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

Stack. En enkel, lineær datastruktur

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

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

Løsningsforslag. Oppgave 1.1. Oppgave 1.2

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

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

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

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

Dagens tema INF1010 INF1010 INF1010 INF1010

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

INF januar 2015 Stein Michael Storleer (michael) Lenkelister

UNIVERSITETET I OSLO

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

Binære trær: Noen algoritmer og anvendelser

Grunnleggende Datastrukturer

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

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister

INF1010. Stein Michael Storleer (michael) Lenkelister

Læringsmål for forelesningen

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

Oppgave 1. Sekvenser (20%)

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

Inf 1020 Algoritmer og datastrukturer

Selv-balanserende søketrær

Array&ArrayList Lagring Liste Klasseparametre Arrayliste Testing Lenkelister Videre

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

Et eksempel: Åtterspillet

Et eksempel: Åtterspillet

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

AlgDat 12. Forelesning 2. Gunnar Misund

PG 4200 Algoritmer og datastrukturer Innlevering 2

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

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

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

UNIVERSITETET I OSLO

Kap 9 Tre Sist oppdatert 15.03

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

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

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

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.3

BOKMÅL Side 1 av 7. KONTINUASJONSEKSAMEN I FAG TDT4100 Objektorientert programmering / IT1104 Programmering, videregående kurs

INF1010 Binære søketrær ++

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

UNIVERSITETET I OSLO

Datastrukturer. Algoritmer og datastrukturer. Øvingsforelesning 2

Hvor raskt klarer vi å sortere?

IN1010 våren januar. Objektorientering i Java

Algoritmer og datastrukturer Løsningsforslag

Algoritmer og datastrukturer Eksamen

INF Algoritmer og datastrukturer

EKSAMEN med løsningsforslag

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

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

UNIVERSITETET I OSLO

EKSAMEN. Algoritmer og datastrukturer

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

Oppgave 1. Oppgave 2. Høgskolen i Østfold Avdeling for informasjonsteknologi

Velkommen til INF1010

INF1010. grensesni-et Comparable<T> grensesni-et Iterable<T> rekursjon

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

Algoritmer og datastrukturer Løsningsforslag

Lenkelister. Lister og køer.

Vi skal se på grafalgoritmer for:

PQ: HEAP. Heap. Er disse heap er? Hvordan implementere heap:

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

København 20 Stockholm

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

Hashing: Håndtering av kollisjoner

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.3

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

Algoritmer og Datastrukturer IAI 21899

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

INF Notater. Veronika Heimsbakk 10. juni 2012

Algoritmer og Datastrukturer

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

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

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

Kap.8 Sortering og søking sist oppdatert 16.03

Transkript:

Lister

Liste som abstrakt konsept/datatype Listen er en lineær struktur (men kan allikevel implementeres ikke-lineært bak kulissene ) 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

Ordnede lister Tre typer av 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 sammenligning av elementenes verdi Indekserte lister Alle elementene har et nummer (oftest 0, 1,..., n-1) som kan brukes til direkte oppslag i listen har ikke hull som i en array

Operasjoner på en liste* removefirst: Fjern første element i listen removelast: Fjern siste element remove: Fjern et bestemt element fra listen first, last: Se på første/siste element contains: Søker etter et bestemt element isempty: Sjekker om listen er tom size: Antall elementer i listen iterator og tostring Merk at innsetting av nye elementer i listen må løses ulikt for ordnede og uordnede lister *: som i lærebokas liste-adt

ListADT.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(); public String tostring();

Iterator? 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 av dataene Eksempel på implementasjon: ArrayIterator.java De fleste Java-collections har en eller flere iteratormetoder og de er litt skumle...

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 en liste Ordnet liste: Kan ikke sette inn slik at sorteringen ødelegges Listen må selv sørge for dette Tilbyr kun én add-metode for å sette inn elementer Uordnet liste: Kan sette inn elementer overalt addtofront: Legger til nytt element først i listen addtorear: Legger til nytt element sist i listen addafter: Legger til nytt element etter et bestemt element i listen

ADT for ordnet* og uordnet liste public interface OrderedListADT<T> extends ListADT<T> { public void add (T element); } public interface UnorderedListADT<T> extends ListADT<T> { public void addtofront (T element); } public void addtorear (T element); public void addafter (T element, T target); *: Elementene i en ordnet liste må være av typen Comparable, dette ligger ikke i ADT'en, men sjekkes i stedet av add-metoden

Eksempel på bruk av ordnet liste: Oppsett av en turnering Et antall (fotball?)lag skal spille en cup/utslagsturnering 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 (2, 4, 8, 16, ) Navn på hvert lag En rangering av hvert lag, i form av antall kamper som laget har vunnet

Turnering: Implementasjon Egen klasse for lagene, med navn og antall vunne kamper, som implementerer Comparable Leser inn antall lag og data for hvert av lagene fra bruker Legger alle lag inn i en liste som er ordnet/sortert på antall vunne kamper Deretter, inntil listen er tom: Ta ut første og siste element/lag i listen, og skriv ut at disse to skal spille mot hverandre Se koden fra læreboka

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 index 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 antalll elementer i listen i tillegg til selve arrayen Kode fra læreboka: ArrayList.java

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 (skiftes) en plass til venstre for å unngå hull remove krever i tillegg et søk (intern metode find) Fjerning er generelt en O(n)-operasjon for en array-liste med n elementer Animasjon

Liste med array: Søke etter element public T 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 en 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 å ordnete/sorterte array-lister hvis vi bruker binærsøk

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 er en O(n)-operasjon for en uordnet array-liste med n elementer Animasjon Kode fra læreboka

Liste med array: Innsetting av element i ordnet liste 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

Lister implementert med lenker Bruker noder av typen LinearNode, med én referanse til neste node og én til selve listeobjektet, for å skille implementasjon av datatstrukturen fra selve dataene (uavhengighet) Lagrer referanser til første (head) og siste (tail) element i listen, samt antall elementer (count) Vi må alltid gå inn gjennom første node for å få tilgang til resten av listen når en lenket liste er énveis (bare pekere til neste node) 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 for en lenket liste med n elementer Animasjon

Lenket liste: Søke etter element public T 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 en O(n)- operasjon Kan ikke effektiviseres, selv om listen er ordnet/sortert 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(!) binært søketre

Lenket liste: Innsetting av element* Uordnet liste, tre metoder: public void addtofront (T element); public void addtorear (T element); public void addafter (T element, T target); Ordnet liste: public void add (T element); Innsetting først eller sist er trivielt, O(1) addafter og add krever begge 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 er O(n) for en lenket liste Animasjon *: Ikke implementert i læreboka

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 Anvendelse: Redigering av en linje med tekst

Indekserte lister Har samme funksjonalitet/metoder i ADT som for en vanlig liste Tilbyr i tillegg mulighet for å se på, sette inn og fjerne elementer på en bestemt posisjon/indeks i listen En indeksert liste er ikke (bør ikke?) være ordnet Indekserte lister er implementert som del av Java Collections API, i java.util.arraylist

En anvendelse av indekserte lister: Josephus' problem 2000 år gammel historie, se Wikipedia Animert forklaring av problemet (Applet) Forenklet: Ta ut hvert tredje(?) element fra en liste, inntil kun ett element står igjen (evt. inntil listen er tom Eksempel: 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 å skrive ut rekkefølgen som elementene tas ut i Listen behandles som om den var sirkulær vi går til begynnelsen når vi kommer til slutten av listen 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 p: Indeks/posisjon til element som skal fjernes d: Avstand mellom elementene som fjernes n: Antall elementer som er igjen i listen 1. Legg inn alle elementene i en indeksert liste L 2. Sett indeks til første element som fjernes: p = d 1 3. Så lenge som L ikke er tom 3.1 Fjern (og skriv ut) elementet på indeks p i listen 3.2 Antall elementer som er igjen etter fjerning: n = n 1 3.3 Hvis n > 0 3.3.1 Finn indeks til neste element som skal tas ut av listen: p = (p + d 1) % n Se Java-koden fra læreboka

Lister i Java Collections API Implementasjonene i Java Collections inneholder mye mer enn våre lister (se læreboka, kapittel 6.6) Tre separate implementasjoner av lister i Java: Java.util.Vector: Indeksert array-liste Java.util.ArrayList: Indeksert array-liste Java.util.LinkedList: Lenket liste Vector er synkronisert, ArrayList ikke: ArrayList er raskere Vector sikrer mot overskriving ved bruk av threads Alle tre har innebygget metoder som i tillegg implementerer stack og ulike varianter av køer

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 listen er O(n) Lenket liste: Fordeler: Innsetting først og sist er O(1) Fleksibel, flere varianter Ulemper: Fiklete implementasjon Ikke direkte oppslag Søking, innsetting og fjerning inne i listen er O(n)