Kapittel 8: Sortering og søking INF100

Like dokumenter
Kapittel 8: Sortering og søking INF100

Kapittel 8: Sortering og søking

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

Kapittel 7: Mer om arv

Kapittel 6: Arv. Redigert av: Khalid Azim Mughal

Kap.8 Sortering og søking sist oppdatert 16.03

INF1010 Sortering. Marit Nybakken 1. mars 2004

Kapittel 8: Programutvikling

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

INF1010. Grensesnittet Comparable<T>

Sortering med Comparable og Comparator

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

UNIVERSITETET I OSLO

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

Løsningsforslag til eksamen i INF1000 våren 2006

Kapittel 5: Objektkommunikasjon

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

UNIVERSITETET I OSLO

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; }

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

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

INF1010. Stein Michael Storleer (michael) Lenkelister

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

OPPGAVE 5b og 8b Java Kode

INF Løsning på seminaropppgaver til uke 8

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

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

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

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

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

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

INF1010 våren februar. Arv og subklasser, del 2

Kapittel 12: Rekursjon

Programmeringsspråket C

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

INF Notater. Veronika Heimsbakk 10. juni 2012

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) Løsningsforslag

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

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

INF1010 siste begreper før oblig 2

INF1010 notat: Binærsøking og quicksort

TDT4100 Objektorientert programmering

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

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

EKSAMEN. Emne: Algoritmer og datastrukturer

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

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

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

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

Kapittel 3: Bruk av objekter

INF1010 våren Arv, subklasser og grensesnitt - del 2

Det finnes ingenting. som kan gjøres med interface. men som ikke kan gjøres uten

INF2100. Oppgaver 26. september til 1. oktober 2007

INF1010 våren Arv og subklasser del 1

Sortering med tråder - Quicksort

EKSAMEN med løsningsforslag

Oppsummering. Kort gjennomgang av klasser etc ved å løse halvparten av eksamen Klasser. Datastrukturer. Interface Subklasser Klasseparametre

INF Seminaroppgaver til uke 3

INF Uke 10. Ukesoppgaver oktober 2012

INF1010 Binære søketrær ++

TDT4105 Informasjonsteknologi, grunnkurs

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

UNIVERSITETET I OSLO

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

Fra Python til Java. En introduksjon til programmeringsspråkenes verden. Dag Langmyhr

Forelesning inf Java 5

INF1010 våren februar. Arv og subklasser, del 2. Repetisjon. Repetisjon - Biler. Repetisjon: Klasser - Subklasser

Forelesning inf Java 5

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

Forkurs INF1010. Dag 1. Andreas Færøvig Olsen Tuva Kristine Thoresen

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

Dagens forelesning. Java 13. Rollefordeling (variant 1) Rollefordeling (variant 2) Design av større programmer : fordeling av roller.

INF1010 våren januar. Objektorientering i Java

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

EKSAMEN. Algoritmer og datastrukturer

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

IN1010. Fra Python til Java. En introduksjon til programmeringsspråkenes verden Dag Langmyhr

TOD063 Datastrukturer og algoritmer

INF1010 våren Grensesnitt

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

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

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

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

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

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Transkript:

Forelesningsnotater for: Kapittel 8: Sortering og søking INF100 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/15

Emneoversikt Pseudokode Ordnede datamengder Naturlig ordning Sammenligningsoperatorer og - metoder Sorteringsalgoritmer: Boblesortering Søking Linært søk Sortering Inndata Utdata JFPS 8: Sortering og søking 8-2/15

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/15

Ordnede primtive dataverdier Tallverdier og tegn kan sammenlignes vha. operatorene: == (likhet)!= (ulikhet) < (mindre enn) > (større enn), <= (mindre eller lik) >= (større eller lik) JFPS 8: Sortering og søking 8-4/15

Boblesortering Tabell a: 0 1 2 3 4 8 4 6 2 1 0 1 2 3 4 4 6 2 1 8 0 1 2 3 4 4 2 1 6 8 0 1 2 3 4 2 1 4 6 8 0 1 2 3 4 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/15

Sortering av objekter 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. Objekter sammenlignes for likhet 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! Objekters innbyrdes ordning avgjøres vha. metoden compareto(), som er spesifisert i kontrakten Comparable. JFPS 8: Sortering og søking 8-6/15

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-7/15

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 boblesorteringmedobjekter(comparable[] tab) { boolean sortert = false; for (int i = tab.length -1; (i > 0) && (!sortert); i--) { sortert = true; System.out.println("Pass: " + (tab.length - i)); for (int k = 0; k < i; k++) if (tab[k].compareto(tab[k+1]) > 0) { // ombytting Comparable temp = tab[k]; tab[k] = tab[k+1]; tab[k+1] = temp; sortert = false; JFPS 8: Sortering og søking 8-8/15

public class BobleKlient { public static void main(string args[]) { Integer itab[] = {8,4,6,2,1; System.out.println("Før sortering:"); for (int heltall : itab) System.out.print(heltall + "\t"); System.out.println(); HjelpeKlasse.boblesorteringMedObjekter(iTab); System.out.println("Etter sortering:"); for (int heltall : itab) System.out.print(heltall+ "\t"); System.out.println(); Før sortering: 8 4 6 2 1 Pass: 1 Pass: 2 Pass: 3 Pass: 4 Etter sortering: 1 2 4 6 8 JFPS 8: Sortering og søking 8-9/15

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/15

Linærsøk for objekter Objekter sammenlignes for objektlikhet med equals()-metoden. Klassen String implementerer equals()-metoden, og det gjør også wrapperklassene for primitive verdier. Linærsøk-metoden fra HjelpeKlasse. public static int linaersoek(comparable[] tab, Comparable nøkkel) { boolean funnet = false; int teller = 0; while (teller < tab.length &&!funnet) if (nøkkel.equals(tab[teller])) funnet = true; // verdi er funnet else ++teller; // ellers fortsett nedover //!(teller < tab.length &&!funnet) <=> (teller >= tab.length funnet) assert (teller >= tab.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 + " ikke finnes!"); return teller; // Returnerer indeksen der nøkkel er eller burde vært. JFPS 8: Sortering og søking 8-11/15

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-12/15

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-13/15

Eksempel: sortering og søking med objekter (forts.) Bruker sorteringsmetoden fra HjelpeKlasse. public class VareKatalogII { 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.boblesorteringMedObjekter(varekatalog); HjelpeKlasse.skrivTabell(varekatalog, "Sortert varekatalog:"); HjelpeKlasse.linaersoek(varekatalog, new Vare("Solo 0.5l", 10)); HjelpeKlasse.linaersoek(varekatalog, new Vare("Pepsi 0.5l", 10)); JFPS 8: Sortering og søking 8-14/15

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 Pass: 1 Pass: 2 Pass: 3 Pass: 4 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 Verdi Varenavn: Solo 0.5l Beholdning: 10 funnet i element med indeks 4 Verdi Varenavn: Pepsi 0.5l Beholdning: 10 ikke finnes! JFPS 8: Sortering og søking 8-15/15