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 13: Grafiske brukergrensesnitt INF 100. Java som første programmeringsspråk

Kapittel 8: Programutvikling

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

Kapittel 15: Grafiske brukergrensesnitt: Enkel GUI. Del I

Løsningsforslag til eksamen i INF1000 våren 2006

INF1010. Grensesnittet Comparable<T>

UNIVERSITETET I OSLO

Sortering med Comparable og Comparator

Kapittel 5: Objektkommunikasjon

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

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. Krav til klasseparametre 2. Om å gå gjennom egne beholdere (iteratorer) Stein Gjessing Inst. for Informatikk Universitetet i Oslo

INF1010. Stein Michael Storleer (michael) Lenkelister

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

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

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

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

INF Løsning på seminaropppgaver til uke 8

OPPGAVE 5b og 8b Java Kode

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

UNIVERSITETET I OSLO

INF Notater. Veronika Heimsbakk 10. juni 2012

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

UNIVERSITETET I OSLO

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

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

Repitisjonskurs. Arv, Subklasser og Grensesnitt

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

Kapittel 12: Rekursjon

Programmeringsspråket C

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

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

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

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

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

INF Uke 10. Ukesoppgaver oktober 2012

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

TDT4105 Informasjonsteknologi, grunnkurs

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

UNIVERSITETET I BERGEN Det matematisk-naturvitenskapelige fakultet

TDT4100 Objektorientert programmering

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

UNIVERSITETET I OSLO

INF1010 notat: Binærsøking og quicksort

INF1010 siste begreper før oblig 2

EKSAMEN. Emne: Algoritmer og datastrukturer

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

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 3: Bruk av objekter

Algoritmer og Datastrukturer

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

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

INF1010 våren Arv og subklasser del 1

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

EKSAMEN med løsningsforslag

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

INF2100. Oppgaver 26. september til 1. oktober 2007

EKSAMEN. Algoritmer og datastrukturer

TOD063 Datastrukturer og algoritmer

Sortering med tråder - Quicksort

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

INF Seminaroppgaver til uke 3

Forelesning inf Java 5

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

Forelesning inf Java 5

INF1010 Binære søketrær ++

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Eksamen

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

UNIVERSITETET I OSLO

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

Universitetet i Bergen Det matematisk-naturvitenskapelige fakultet Institutt for informatikk

Introduksjon til objektorientert programmering

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

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

Eksekveringsrekkefølgen (del 1) Oppgave 1. Eksekveringsrekkefølgen (del 2) Kommentar til oppgave 1. } // class Bolighus

Forkurs INF1010. Dag 3. Andreas Færøvig Olsen Gard Inge Rosvold Institutt for Informatikk, 15.

INF1010 våren januar. Objektorientering i Java

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

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 tillat 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: 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/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 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); 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 ++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); 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 if (beholdning < varebeholdning) return -1; // denne varen har mindre beholdning return 1; // denne varen har større beholdning if (varenavn.compareto(varenavn2) < 0) return -1; // denne varen har et "mindre" navn 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