Kapittel 8: Sortering og søking

Like dokumenter
Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

Kapittel 8: Sortering og søking INF100

Kapittel 8: Sortering og søking INF100

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

Kapittel 7: Mer om arv

Kap.8 Sortering og søking sist oppdatert 16.03

INF1010 Sortering. Marit Nybakken 1. mars 2004

Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

Kapittel 8: Programutvikling

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

Kapittel 13: Grafiske brukergrensesnitt INF 100. Java som første programmeringsspråk

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

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

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

Sortering med Comparable og Comparator

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

UNIVERSITETET I OSLO

Løsningsforslag til eksamen i INF1000 våren 2006

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

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

UNIVERSITETET I OSLO

Kapittel 5: Objektkommunikasjon

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

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

UNIVERSITETET I OSLO

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

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

INF1010 notat: Binærsøking og quicksort

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

INF1010. Grensesnittet Comparable<T>

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

OPPGAVE 5b og 8b Java Kode

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

TDT4105 Informasjonsteknologi, grunnkurs

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

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Løsningsforslag

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

EKSAMEN med løsningsforslag

Kapittel 12: Rekursjon

INF1010 siste begreper før oblig 2

Algoritmer og Datastrukturer

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

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Eksamen

Leksjon 6. Objekt. Evt. importsetninger. public class Klasse { Konstruktør. Objektmetoder. Innkapsling (private): set-og get-metoder

INF1010 Binære søketrær ++

EKSAMEN. Emne: Algoritmer og datastrukturer

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

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

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

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

EKSAMEN. Algoritmer og datastrukturer

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Algoritmer og datastrukturer Kapittel 4 - Delkapittel 4.4

Programmeringsspråket C

INF Løsning på seminaropppgaver til uke 8

Forelesning inf Java 5

INF Notater. Veronika Heimsbakk 10. juni 2012

Forelesning inf Java 5

INF1010 våren 2008 Uke 4, 22. januar Arv og subklasser

Oppgave 1. Sekvenser (20%)

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

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

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

1. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

Algoritmer og Datastrukturer IAI 21899

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

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

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

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

Sortering med tråder - Quicksort

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

Algoritmer og Datastrukturer

Repitisjonskurs. Arv, Subklasser og Grensesnitt

Norges Informasjonsteknologiske Høgskole

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

INF Seminaroppgaver til uke 3

Liste som abstrakt konsept/datatype

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

TDT4100 Objektorientert programmering

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Sensur-veiledning INF1000 h 2013 (fasit) am - 6. des. 2013

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

Kapittel 12: Filer og strømmer INF 100. Java som første programmeringsspråk

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

Eksempel: Uttrykkstrær I uttrykkstrær inneholder bladnodene operander (konstanter, variable,... ), mens de interne nodene inneholder operatorer.

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

Datastrukturer for rask søking

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Obligatorisk oppgave 1 INF1020 h2005

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

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

Transkript:

Kapittel 8: Sortering og søking Forelesningsnotater for: Java som første programmeringsspråk Khalid Azim Mughal, Torill Hamre, Rolf W. Rasmussen Cappelen Akademisk, 2003. ISBN 82-02-23274-0 http://www.ii.uib.no/~khalid/jfps/ Vi gir tillatelse til å bruke notatene i tilknytning til boken. Modifisert: 16/1/06 JFPS 8: Sortering og søking 8-1/18

Emneoversikt Pseudokode Ordnede datamengder Naturlig ordning Sammenligningsoperatorer og - metoder Sorteringsalgoritmer: Boblesortering Sortering ved utvalg Sortering ved innsetting Sortering av objekter Kontrakten Comparable Søking Linært søk Binært søk Eksempel: sortering og søking med objekter Sortering Inndata Utdata JFPS 8: Sortering og søking 8-2/18

Pseudokode Pseudokode beskriver en algoritme i vanlig språk. Kontrollflyt angis vha. spesielle ord, f.eks. hvis for å innlede en valgsetning. Strukturen til handlingene i algoritmen vises vha. innrykk. Eksempel: boblesortering For hvert gjennomløp: For hvert nabopar i usortert del av tabellen: Hvis verdier i nabopar står i feil rekkefølge: Bytt om verdier i nabopar Pseudokode er skrevet av og for programmerere. Den er et nyttig hjelpemiddel i algoritmeutvikling. Kompliserte steg kan forfines videre inntil man forstår problemet tilstrekkelig til å kunne starte kodingen. Dessuten kan pseudokode skrives inn i kildekoden, og dermed inngå som en del av dokumentasjonen. JFPS 8: Sortering og søking 8-3/18

Ordnede datamengder Naturlig ordning for verdier av type T: To verdier a og b av en type T kan sammenlignes for å avgjøre om a er mindre enn, lik eller større enn b. Numeriske datatyper og tegn kan sammenlignes vha. operatorene: == (likhet)!= (ulikhet) < (mindre enn) > (større enn), <= (mindre eller lik) >= (større eller lik) Objekter sammenlignes vha. == (referanselikhet) og equals() (objektlikhet). Metoden equals() må overkjøres hvis superklassens metode ikke har en passende implementasjon. Pass på at du ikke overlaster equals()-metoden! JFPS 8: Sortering og søking 8-4/18

Boblesortering Tabell a: 8 4 6 2 1 4 6 2 1 8 4 2 1 6 8 2 1 4 6 8 1 2 4 6 8 Gitt n = antall elementer -1, dvs lik 4. 1. pass: for k = 0(1)n-1: hvis element k er større enn element k+1, bytt elementene. 2. pass: for k = 0(1)n-2: hvis element k er større enn element k+1, bytt elementene. 3. pass: for k = 0(1)n-3: hvis element k er større enn element k+1, bytt elementene. 4. pass: for k = 0(1)n-4: hvis element k er større enn element k+1, bytt elementene. Antall pass er lik n, dvs antall elementer -1. a[0] a[1]... a[n] int a[] = {8,4,6,2,1; // For hvert gjennomløp: for (int i = a.length -1; i > 0; i--) { // For hvert nabopar i // usortert del av tabellen for (int k = 0; k < i; k++) // Hvis verdier i // nabopar står i feil // rekkefølge: Bytt om // verdier i nabopar if (a[k] > a[k+1]) { int temp = a[k]; a[k] = a[k+1]; a[k+1] = temp; Denne algoritmen kan forbedres. JFPS 8: Sortering og søking 8-5/18

Sortering ved utvalg Tabell a: 8 4 6 2 1 1 4 6 2 8 1 2 6 4 8 1 2 4 6 8 1 2 4 6 8 - finn minste i hele tabellen. - bytt a[0] med den minste. - finn minste fra a[1] til a[4]. - bytt a[1] med den minste. - finn minste fra a[2] til a[4]. - bytt a[2] med den minste. osv. - fortsett inntil hele tabellen er gjennomgått. int a[] = {8,4,6,2,1; // For hvert gjennomløp: for (int ind = 0; ind < a.length - 1; ind++) { // Finn minste-verdi i usortert // del av tabellen int ind_til_minste = ind; for (int k = ind + 1; k < a.length; k++) if (a[k] < a[ind_til_minste]) ind_til_minste = k ; // Bytt om på minste-verdi og første // element i usortert del int temp = a[ind_til_minste]; a[ind_til_minste] = a[ind]; a[ind] = temp; JFPS 8: Sortering og søking 8-6/18

Tabell a: 8 4 6 2 1 4 8 6 2 1 4 6 8 2 1 2 4 6 8 1 1 2 4 6 8 Sortering ved innsetting sett inn verdi til a[1] på riktig plass s.a. a[0] a[1]. sett inn verdi til a[2] på riktig plass s.a. a[0] a[1] a[2]. sett inn verdi til a[3] på riktig plass s.a. a[0] a[1] a[2] a[3]. sett inn verdi til a[4] på riktig plass s.a. a[0] a[1]... a[4]. for (i = 1; i < a.length; i++) - sett verdi til a[i] inn i riktig posisjon j blant elementene a[0]...a[i]. for (i = 1; i < a.length; i++) - finn riktig posisjon j, 0 j i, for verdi til a[i] ved å flytte verdiene til a[j]...a[i-1] en posisjon til høyre. - plasser verdi til a[i] i posisjonen j. int a[] = {8,4,6,2,1; // For hvert gjennomløp: for (int i = 1; i < a.length; i++) { // Ta vare på neste-verdi som innsettes int verdi = a[i]; // Forskyv alle verdier i sortert // deltabell som er større enn denne // ett hakk bakover i tabellen int j; for (j = i; (j > 0 && verdi < a[j-1]); j--) a[j] = a[j-1]; // flytt bakover! a[j] = verdi; // inn på riktig plass! JFPS 8: Sortering og søking 8-7/18

Kontrakten Comparable Objekters innbyrdes ordning avgjøres vha. metoden compareto(), som er spesifisert i kontrakten Comparable. interface Comparable { int compareto(object objref); Kallet obj1.compareto(obj2) skal returnere et heltall som er: == 0 hvis obj1 og obj2 er like < 0 hvis obj1 kommer før obj2 > 0 hvis obj1 kommer etter obj2 i den naturlige ordningen. Alle klasser der objektene skal ha en naturlig ordning må implementere denne kontrakten. Implementasjonen av compareto()-metoden må være i samsvar med klassens implementasjon av equals()-metoden. JFPS 8: Sortering og søking 8-8/18

Sortering av objekter En klasse må implementere kontrakten Comparable, dersom objekter skal ha en naturlig ordning. Klassen String implementerer kontrakten Comparable, og det gjør også wrapperklassene for primitive verdier. // HjelpeKlasse som sorterer Comparable-objekter. public static void sorter(comparable[] comptab) { // Fra Program 8.4 // For hvert gjennomløp: for (int neste=1; neste<comptab.length; neste++) { // Ta vare på neste-verdi som skal innsettes Comparable verdi = comptab[neste]; // Forskyv alle verdier i sortert deltabell som er større enn // neste verdi ett hakk bakover i tabellen int dette; // indeks for riktig plassering av verdi for (dette=neste; dette>0 && verdi.compareto(comptab[dette-1])<0; dette--) { comptab[dette] = comptab[dette-1]; // flytt bakover! comptab[dette] = verdi; skrivtabell(comptab, neste+". gjennomløp: "); JFPS 8: Sortering og søking 8-9/18

Linært søk Problem: Finn en gitt verdi (om den finnes!) i en tabell. Verdien vi søker etter kalles for en nøkkel. int a[] = {8,4,6,2,1; int nøkkel = 6; boolean funnet = false; int teller = 0; while (teller < a.length &&!funnet) if (a[teller] == nøkkel) funnet = true; // verdi er funnet else teller++; // ellers fortsett i tabellen //!(teller < a.length &&!funnet) <=> (teller >= a.length funnet) assert (teller >= a.length funnet) : "Feil i linært søk"; if (funnet) System.out.println("Verdi " + nøkkel + " funnet i element med indeks " + teller); else System.out.println("Verdi " + nøkkel + " finnes ikke!"); Nøkkelen kan være hvilket som helst element siden tabellen er usortert; dette krever (N_ELEMENT/2) sammenligninger i gjennomsnitt. JFPS 8: Sortering og søking 8-10/18

Binært søk Problem: Finn en gitt verdi (om den finnes!) i en sortert tabell int a[] = {11,19,24,30,32,48,50,55,72,99; // verdier i stigende rekkefølge. int nøkkel = 48; int l = 0, h = a.length - 1, m = -1; boolean funnet = false, finnes = true; while (finnes &&!funnet) { m = (l + h) / 2; // midten av tabellen if (l > h) finnes = false; // nøkkel finnes ikke else if (a[m] == nøkkel) funnet = true; // nøkkel er i a[m] else if (a[m] < nøkkel) l = m + 1; // finnes nøkkel, så er den i øvre halvparten else h = m - 1; // finnes nøkkel, så er den i nedre halvparten //!(finnes &&!funnet) <=> (!finnes funnet) assert (!finnes funnet) : "Feil i binært søk"; if (funnet) System.out.println("Verdi " + nøkkel + " funnet i element med indeks " + m); else System.out.println("Verdi " + nøkkel + " finnes ikke!"); JFPS 8: Sortering og søking 8-11/18

Binært søk (forts.) Nøkkel er 48 a[] a[] a[] [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] 11 19 24 30 32 48 50 55 72 99 l = 0 m = (0+9)/2 h = 9 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] 11 19 24 30 32 48 50 55 72 99 l = 5 m = (5+9)/2 h = 9 [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] 11 19 24 30 32 48 50 55 72 99 l = 5 h = 6 m = (5+6)/2 a[m] == nøkkel 1 2 3 Maks. antall sammenligninger angitt ved 2 sammenligninger = N_ELEMENT, dvs. sammenligninger = log 2 N_ELEMENT, f.eks. for N_ELEMENT lik 9, er sammenligninger lik 3. JFPS 8: Sortering og søking 8-12/18

Binært søk for objekter Binært søk-metoden fra HjelpeKlasse. public static int binsøk(comparable[] tab, Comparable nøkkel) { int l = 0, h = tab.length - 1, m = -1; boolean funnet = false, finnes = true; while (finnes &&!funnet) { m = (l + h) / 2; // midten av tabellen if (l > h) finnes = false; // nøkkel finnes ikke else { int status = tab[m].compareto(nøkkel); // Sammenlign if (status == 0) funnet = true; // nøkkel er i tab[m] else if (status < 0) l = m + 1; // finnes nøkkel, // så er den i øvre halvparten else h = m - 1; // finnes nøkkel, så er den i nedre halvparten //!(finnes &&!funnet) <=> (!finnes funnet) assert (!finnes funnet) : "Feil i binært søk"; if (funnet) System.out.println(nøkkel + " funnet i element med indeks " + m); else System.out.println(nøkkel + " ikke finnes!"); return m; // Returnerer indeksen der nøkkel er eller burde vært. JFPS 8: Sortering og søking 8-13/18

Eksempel: sortering og søking med objekter public class Vare implements Comparable { String varenavn; // navn på det som kan kjøpes int beholdning; // antallet som er ikke solgt Vare(String varenavn, int beholdning) { assert beholdning >= 0: "Beholdning må være mer enn 0 varer."; this.varenavn = varenavn; this.beholdning = beholdning; public String hentvarenavn() { return varenavn; public int hentbeholdning() { return beholdning; public void settvarenavn(string varenavn) { this.varenavn = varenavn; public void settbeholdning(int beholdning) { assert beholdning >= 0: "Beholdning må være mer enn 0 varer."; this.beholdning = beholdning; JFPS 8: Sortering og søking 8-14/18

public int compareto(object obj) { assert (obj instanceof Vare) : "Ikke et Vare-objekt"; if (this == obj) return 0; Vare vare = (Vare) obj; String varenavn2 = vare.hentvarenavn(); int varebeholdning = vare.hentbeholdning(); if (varenavn.compareto(varenavn2) == 0) { // samme varenavn if (beholdning == varebeholdning) return 0; // samme beholdning, dvs. samme varen else if (beholdning < varebeholdning) return -1; // denne varen har mindre beholdning else return 1; // denne varen har større beholdning else if (varenavn.compareto(varenavn2) < 0) return -1; // denne varen har et "mindre" navn else return 1; // denne varen har et "større" navn public boolean equals(object obj) { // Samsvar med compareto() if (!(obj instanceof Vare)) return false; return this.compareto(obj) == 0; //... JFPS 8: Sortering og søking 8-15/18

Eksempel: sortering og søking med objekter (forts.) Bruker sorteringsmetoden fra HjelpeKlasse. public class VareKatalog { public static void main(string[] args) { Vare[] varekatalog = { new Vare("Cola 0.5l", 30), new Vare("Cola 0.33l", 20), new Vare("Pepsi 0.5l", 20), new Vare("Solo 0.5l", 10), new Vare("Cola 0.33l", 25) ; HjelpeKlasse.skrivTabell(varekatalog, "Usortert varekatalog:"); HjelpeKlasse.sorter(varekatalog); HjelpeKlasse.skrivTabell(varekatalog, "Sortert varekatalog:"); HjelpeKlasse.binsøk(varekatalog, new Vare("Solo 0.5l", 10)); HjelpeKlasse.binsøk(varekatalog, new Vare("Pepsi 0.5l", 10)); JFPS 8: Sortering og søking 8-16/18

Eksempel: sortering og søking med objekter (forts.) Utskrift fra kjøring: Usortert varekatalog: Varenavn: Cola 0.5l Beholdning: 30 Varenavn: Cola 0.33l Beholdning: 20 Varenavn: Pepsi 0.5l Beholdning: 20 Varenavn: Solo 0.5l Beholdning: 10 Varenavn: Cola 0.33l Beholdning: 25 1. gjennomløp: Varenavn: Cola 0.33l Beholdning: 20 Varenavn: Cola 0.5l Beholdning: 30 Varenavn: Pepsi 0.5l Beholdning: 20 Varenavn: Solo 0.5l Beholdning: 10 Varenavn: Cola 0.33l Beholdning: 25 2. gjennomløp: Varenavn: Cola 0.33l Beholdning: 20 Varenavn: Cola 0.5l Beholdning: 30 Varenavn: Pepsi 0.5l Beholdning: 20 Varenavn: Solo 0.5l Beholdning: 10 Varenavn: Cola 0.33l Beholdning: 25 JFPS 8: Sortering og søking 8-17/18

3. gjennomløp: Varenavn: Cola 0.33l Beholdning: 20 Varenavn: Cola 0.5l Beholdning: 30 Varenavn: Pepsi 0.5l Beholdning: 20 Varenavn: Solo 0.5l Beholdning: 10 Varenavn: Cola 0.33l Beholdning: 25 4. gjennomløp: Varenavn: Cola 0.33l Beholdning: 20 Varenavn: Cola 0.33l Beholdning: 25 Varenavn: Cola 0.5l Beholdning: 30 Varenavn: Pepsi 0.5l Beholdning: 20 Varenavn: Solo 0.5l Beholdning: 10 Sortert varekatalog: Varenavn: Cola 0.33l Beholdning: 20 Varenavn: Cola 0.33l Beholdning: 25 Varenavn: Cola 0.5l Beholdning: 30 Varenavn: Pepsi 0.5l Beholdning: 20 Varenavn: Solo 0.5l Beholdning: 10 Varenavn: Solo 0.5l Beholdning: 10 funnet i element med indeks 4 Varenavn: Pepsi 0.5l Beholdning: 10 ikke finnes! JFPS 8: Sortering og søking 8-18/18