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

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

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

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

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

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

Quicksort. Fra idé til algoritme.

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

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

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

INF1010 Binære søketrær ++

UNIVERSITETET I OSLO

INF1010 siste begreper før oblig 2

INF1010 notat: Binærsøking og quicksort

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

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

Velkommen til INF1010

Lenkelister. Lister og køer.

Definisjon av binært søketre

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

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

UNIVERSITETET I OSLO

INF2220: Time 12 - Sortering

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

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

Hvor raskt klarer vi å sortere?

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF Algoritmer og datastrukturer

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

Logaritmiske sorteringsalgoritmer

Definisjon: Et sortert tre

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

INF Algoritmer og datastrukturer

Kapittel 8: Sortering og søking

Binære trær: Noen algoritmer og anvendelser

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

UNIVERSITETET I OSLO

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

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

Løsnings forslag i java In115, Våren 1996

UNIVERSITETET I OSLO

Kapittel 9: Sortering og søking Kort versjon

Kapittel 9: Sortering og søking Kort versjon

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

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

Datastrukturer for rask søking

UNIVERSITETET I OSLO

Innhold. Innledning 1

INF Algoritmer og datastrukturer

Rekursiv programmering

8NH )RUHOHVQLQJ 'HSDUWPHQWÃRIÃ,QIRUPDWLFVÃ8QLYHUVLW\ÃRIÃ2VORÃ1RUZD\,1) ± $OJRULWKPVÃÉÃ'DWDÃ6WUXFWXUHV

Løsnings forslag i java In115, Våren 1998

INF Algoritmer og datastrukturer

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

UNIVERSITETET I OSLO

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

Rekursjon. Hanois tårn. Milepeler for å løse problemet

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

Algoritmer og datastrukturer Eksamen

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

INF2220: Forelesning 2

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

Vanlige datastrukturer. I dette lysarksettet

Selv-balanserende søketrær

København 20 Stockholm

Kapittel 9: Sortering og søking Kort versjon

UNIVERSITETET I OSLO

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

Norsk informatikkolympiade runde

Algoritmer og Datastrukturer

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

O-notasjon og kompleksitet

Palindrom - iterativt

IN Algoritmer og datastrukturer

UNIVERSITETET I OSLO

Norsk informatikkolympiade runde

Norsk informatikkolympiade runde

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

TDT4105 Informasjonsteknologi, grunnkurs

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Obligatorisk oppgave 4 i INF1010, våren 2014: "Leger og resepter" Versjon 1.1

Kapittel 8: Sortering og søking INF100

Kapittel 8: Sortering og søking INF100

UNIVERSITETET I OSLO

INF1010. Om pensum INF1010 INF1010 INF1010 INF1010. Det vesentlige er å forstå og kunne lage programmer ved hjelp av eksemplene i bøkene.

7) Radix-sortering sekvensielt kode og effekten av cache

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

Oppgave 1. Sekvenser (20%)

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF Uke 11. Ukeoppgaver oktober 2012

INF Algoritmer og datastrukturer

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

Løsningsforslag til INF110 h2001

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

Transkript:

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

«orden» i dataene vi blir fort lei av å lete poleksempel internett «alt» er søking og sortering alternativer til sortering og søking binære trær søketrær michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 2

Forutsetter at vi kan rangere elementene. Gitt to elementer, programmet må kunne teste om det ene elementet er lik, mindre enn eller større enn det andre, jf. grensesnittet Comparable med metoden compareto... I eksemplene sorterer vi ofte enkle «objekter» som heltall, tegn eller strenger. Ikke vanskeligere å sortere komplekse objekter så lenge de er «sammenlignbare». Litt mer formaliteter: Med en sortert array mener vi en array (A) der A[0] A[1] A[2] A[3] A[n 2] A[n 1] michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 3

1. Sorterering ved bruk av binærtre som «mellomlager» Programmeringsidé: Sett objektene inn i et binært søketre. Etter at alle er satt inn, ta dem ut i sortert orden (hvordan?) og sett dem inn i arrayet i sortert orden. michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 4

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 5

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 6

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 7

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 8

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 9

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 10

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 11

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 12

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 13

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 14

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 15

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 16

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 17

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 18

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 19

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 20

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 21

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 22

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 23

michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 24

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 25

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 26

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 27

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 28

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 29

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 30

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 31

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 32

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 33

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 34

kryss michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 35

2. Boblesortering Idé: Gå igjennom arrayet og for hver gang man finner to elementer ved siden av hverandre som ligger feil i forhold til sorteringskriteriet, bytt dem. Gjenta gjennomgangen til ingen bytter blir gjort. Påstand: Hvis det ikke finnes to elementer ved siden av hverandre som ikke oppfyller sorteringsregelen, må hele arrayen være sortert. michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 36

3. Flettesortering Algoritmeidé: Del arrayen opp i delarrayer, slik at hver delarray er sortert (et array med ett element er sortert). Flett sammen to og to arrayer til større sorterte delarrayer til det er et array igjen. michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 37

4. Innstikksortering Generell idé: Plukk ett og ett element fra listen og sett det inn på rett plass (sortert) i en ny liste. 1. Finn første element fra venstre som er mindre enn det til venstre for seg ta dette ut. 2. Elementene til venstre for dette skyves mot høyre inntil det uttatte elementet «passer inn». 3. Gjenta 1 2 inntil det siste elementet (helt til høyre) er behandlet. Invariant: A[0 : k] er sortert for k som løper fra 0 til lengden av A 1. michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 38

I programeksemplet nedenfor sorteres et array av tegn, char[] a. void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 39

a c d g h n q e u s o r t e r t void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 40

e a c d g h n q e u s o r t e r t void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 41

e a c d g h n q q u s o r t e r t void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 42

e a c d g h n n q u s o r t e r t void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 43

e a c d g h h n q u s o r t e r t void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 44

e a c d g g h n q u s o r t e r t void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 45

e a c d e g h n q u s o r t e r t void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 46

a c d e g h n q? u s o r t e r t void innstikksortering ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { i f ( a [ k + 1] < a [ k ] ) { // a[ k + 1] står på f e i l plass char tmp = a [ k + 1 ] ; int i = k ; while ( i >= 0 && a [ i ] > tmp) { // a[ i ] > tmp, f l y t t t i l høyre a [ i + 1] = a [ i ] ; i ; // s e t t tmp på rett plass a [ i +1] = tmp; michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 47

En bedre variant? void innstikksorteringvar1 ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { \\ n = a. length 1 \\ A[ 0 : k 1] har de minste elementene og er sortert \\ finner minste element i A[ k : n] på plass j \\ bytt A[ k ] med A[ j ] \\ resultat : A[ 0 : k ] har de minste elementene og er sortert michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 48

Programmerer ut løkka som finner minste element i A[k : n]: void innstikksorteringvar1 ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { \\ n = a. length 1 \\ A[ 0 : k 1] har de minste elementene og er sortert int minsthittil = A[ k ] ; j = k ; for ( int i = k ; i < a. length 1; i ++) i f (A[ i ] < minsthittil ) { minsthittil = A[ i ] ; j = i ; \\ bytt A[ k ] med A[ j ] \\ resultat : A[ 0 : k ] har de minste elementene og er sortert michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 49

Programmerer ut byttet som medfører at den sorterte delen øker med ett element: void innstikksorteringvar1 ( char [ ] a ) { for ( int k = 0; k < a. length 1; k++) { \\ A[ 0 : k 1] har de minste elementene og er sortert int minsthittil = A[ k ] ; j = k ; for ( int i = k ; i < a. length 1; i ++) i f (A[ i ] < minsthittil ) { minsthittil = A[ i ] ; j = i ; int tmp = A[ k ] ; A[ k ] = A[ j ] ; A[ j ] = tmp; \\ A[ 0 : k ] har de minste elementene og er sortert \\ A[ 0 :n] har de minste elementene og er sortert michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 50

Tilstandspåstander Java datastrukturdiagrammer A[0 : k] er sortert i : 0 i < k : A[i] A[i + 1] Alle elementer i A[k : l] er mindre enn alle elmentene i A[m : n] k i l, m j n : A[i] < A[j] Lista inneholder aldri mer enn n objekter... michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 51

Invariante tilstandspåstander påstander som ikke forandrer seg Det er aldri et ulovlig tall i en rute i sudokubrettet A[0 : k] er sortert er en invariant påstand hvis sannhetsverdien ikke forandrer seg når k endrer verdi.... michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 52

Om effektivitet Ikke viktig i INF1010, men vi skal se opp for lange løkker inni hverandre flere rekursive kall i en metode n! når n er stor multiplisering av objekter (metodekall og tråder) uten øvre grense Men effektivitet er et hovedkriterium når vi skal velge lage et godt program/algoritme. michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 53

Programmeringsøvelser til plenumsøvelsen 1. Gjør skriv-metoden i binærtreeksemplet om slik at den istedet leverer en array med objektene i sortert rekkefølge. 2. Skriv en metode som tar to sorterte arrayer som parameter og returnerer en sortert array ved å flette dem sammen. 3. Skriv en metode som boblesorterer et heltallsarray. 4. Skriv en metode som sorterer etter følgende idé (innstikksortering. Invariant?): 4.1 Finn det minste elementet i arrayen ta dette ut. 4.2 Sett det uttatte elementet i fifo-orden inn i et nytt array. 4.3 Gjenta 4.1 4.2 inntil det siste elementet i det første arrayet er tatt ut. michael@ifi.uio.no INF1010 15. april 2010 (uke 15) 54