INF2220: Forelesning 7. Kombinatorisk søking

Like dokumenter
INF1010. Sekvensgenerering Alle mulige sekvenser av lengde tre av tallene 0, 1 og 2: Sekvensgenerering. Generalisering. n n n! INF1010 INF1010 INF1010

IN2010: Forelesning 11. Kombinatorisk søking Beregnbarhet og kompleksitet

Kombinatorisk søking, rekursjon, avskjæring

Om å lete gjennom «alle muligheter» Eller: Kombinatorisk søking, rekursjon og avskjæring 1 Innledning Problemer, instanser og løsningsalgoritmer

En algoritme for permutasjonsgenerering

INF1010 Rekursjon. Marit Nybakken 1. mars 2004

Backtracking som løsningsmetode

Backtracking: Kombinatorikk og permutasjoner

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

Løsningsforslag til INF110 h2001

INF1010 Sortering. Marit Nybakken 1. mars 2004

UNIVERSITETET I OSLO

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

INF1010 notat: Binærsøking og quicksort

INF2220: Forelesning 1

Backtracking som løsningsmetode

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

Dagens tema INF1010 INF1010 INF1010 INF1010

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

Quicksort. Fra idé til algoritme.

UNIVERSITETET I OSLO

PG 4200 Algoritmer og datastrukturer Innlevering 1. Frist: 2.februar kl 21.00

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

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

Løsningsforslag eksamen INF1020 høsten 2005

INF1020 Algoritmer og datastrukturer GRAFER

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

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

INF1010. Rekursjon En rekursiv definisjon av rekursjon, slik det kunne stå i en ordbok: Introduksjon til Rekursiv programmering

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

EKSAMEN. Emne: Algoritmer og datastrukturer

Kapittel 12: Rekursjon

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

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

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

Løsningsforslag 2017 eksamen

Obligatorisk oppgave 1 INF1020 h2005

UNIVERSITETET I OSLO

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

Algoritmer og Datastrukturer

København 20 Stockholm

OPPGAVE 5b og 8b Java Kode

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

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

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

Objektorientert design av kode. Refaktorering.

Løse reelle problemer

EKSAMEN med løsningsforslag

Løsningsforslag EKSAMEN

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF Algoritmer og datastrukturer

INF 1000 høsten 2011 Uke september

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

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

INF1000 undervisningen INF 1000 høsten 2011 Uke september

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

INF 3/ oktober : Avslutte Branch and Bound 23.6: Trær og strategier for spill med to spillere

UNIVERSITETET I OSLO

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

Forelesning inf Java 5

Algoritmer og Datastrukturer

INF2220: Time 8 og 9 - Kompleksitet, beregnbarhet og kombinatorisk søk

Forelesning inf Java 5

INF2100. Oppgaver 23. og 24. september 2010

INF1010 våren januar. Objektorientering i Java

Eksamen INF1010 V2009 Del B prøveeksamen V2010 Vekt 60 %

INF1020 Algoritmer og datastrukturer GRAFER

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

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Kapittel 9: Sortering og søking Kort versjon

Norsk informatikkolympiade runde

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

Repetisjon: Statiske språk uten rekursive metoder (C1 og C2) Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

Algoritmer og datastrukturer Kapittel 11 - Delkapittel 11.2

Rekursjon som programmeringsteknikk

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

Dagens tema Kjøresystemer (Ghezzi&Jazayeri 2.6, 2.7)

INF1000: Forelesning 11. Oppgave 2. Oppgave 1. Husk å melde deg på prøveeksamen i INF1000! Ole Christian Lingjærde 7.november 2006

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

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

INF oktober Stein Krogdahl. Kap 23.5: Trær og strategier for spill med to spillere

Plan: Parameter-overføring Alias Typer (Ghezzi&Jazayeri kap.3 frem til 3.3.1) IN 211 Programmeringsspråk

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

Sortering med tråder - Quicksort

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

INF Uke 10. Løsningsforslag ukesoppgaver oktober 2012

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2014

MAT1030 Diskret Matematikk

UNIVERSITETET I OSLO

Fig1. Den konvekse innhyllinga av 100 tilfeldige punkter i planet (de samme som nyttes i oppgaven.)

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

INF Algoritmer og datastrukturer

UNIVERSITETET I OSLO

De neste ukene. INF1000 Uke 12. Prøveeksamen. Nå - Prøveeksamen. Forelesning om IT og samfunn neste uke (13/11).

GRAFER. Korteste vei i en vektet graf uten negative kanter. Korteste vei, en-til-alle, for: Minimale spenntrær

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

Kapittel 12: Rekursjon

UNIVERSITETET I OSLO

Transkript:

INF2220: Forelesning 7 Kombinatorisk søking

Oversikt Rekursjon - oppsummering Generering av permutasjoner Lett: Sekvens-generering Vanskelig: Alle tallene må være forskjellige Eksempel: Finne korteste reiserute Mer direkte generering av permutasjoner Les notatet Kombinatorisk søking, rekursjon, avskjæring av Stein Krogdahl og Arne Maus. 2

Rekursjon En rekursiv metode er en metode som kaller seg selv. Huskeregler: Det må alltid finnes et basistilfelle som kan løses uten rekursjon. De rekursive kallene må gå i retning av et basistilfelle. Design-regel: Anta at de rekursive kallene fungerer. Ikke løs samme instans av et problem i separate rekursive kall! 3

Oppgave For hver av de to metodene under: Hva er basistilfellet? Hvordan går de rekursive kallene i retning av basistilfellet? void f1(int n) { System.out.println(n); if (n > 1) { f1(n - 1); System.out.println(n); void f2(int n) { if (n > 0) { System.out.print("*"); f2(- (n 1)); else if (n < 0) { System.out.print("!"); f2(- (n + 1)); 4

Sekvens-generering Alle mulige sekvenser av lengde tre av tallene 0, 1 og 2: 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 5

Sekvens-generering: mulig implementasjon // Startkall: gen3(0); int[] p = new int[3]; void gen3(int plass) { for (int siffer = 0; siffer < 3; siffer++) { p[plass] = siffer; if (plass < 2) { gen3(plass + 1); else { System.out.println(""+p[0]+p[1]+p[2]); 6

Generalisering Alle mulige sekvenser av lengde n av tallene fra 0 til n-1: class Gen { int[] p; int n; Gen(int i) { n = i; p = new int[n]; void gen(int plass) { for (int siffer = 0; siffer < n; siffer++) { p[plass] = siffer; if (plass < n - 1) { gen(plass + 1); else { for (int i = 0; i < n; i++) { System.out.print(p[i]); System.out.print("\n"); 7

Kombinatorisk søking Har: Et endelig antall elementer. Skal: Finne en rekkefølge, gjøre et utplukk, lage en oppdeling, Eksempler: Plassere 8 dronninger på et sjakkbrett slik at ingen av dronningene kan slå hverandre. Finne korteste rundtur blant n byer hvor hver by bare besøkes en gang (avstanden mellom ethvert par av byer er kjent). Vi har da problemer hvor vi må: 1. Lage alle interessante kombinasjoner. 2. Teste om en kombinasjon er en løsning på det aktuelle problemet. NB: Ofte slår vi disse sammen, slik at vi bare lager kombinasjoner som er potensielle løsninger. 8

Permutasjoner Alle mulige permutasjoner av tallene fra 0 til n-1: class Gen { int[] p; int n; boolean[] brukt; Gen(int i) { n = i; p = new int[n]; brukt = new boolean[n]; for (int j=0; j<n; j++) { brukt[j] = false; void gen(int plass) { for (int siffer = 0; siffer < n; siffer++) { if (!brukt[siffer]) { brukt[siffer] = true; p[plass] = siffer; if (plass < n - 1) { gen(plass + 1); else { < Lever p til videre bruk. > brukt[siffer] = false; 9

Eksempel: Korteste reiserute 0 12 5 9 4 10 2 6 3 8 7 4 15 11 1 Korteste vei: 36.0 Korteste reiserute (by nr): 0 2 1 4 3 0 10

Korteste reiserute nytt navn finnveier, variabelnavn by i stedet for siffer startkall: finnveier(1) p[0] = 0 er startbyen void finnveier(int plass) { for (int by = 1; by < n; by++) { if (!brukt[by]&&!(lengde + avstand[p[plass-1]][by] >= minlengde) ){ float brukt[by] = true; lengde += avstand[p[plass-1]][by]; lengde: lengden på p[plass] = by; float[][] avstand: nåværende if (plass < n - 1) { avstanden mellom rute finnveier(plass + 1); ethvert par av byer else if (lengde + avstand[by][0] < minlengde) { minlengde = lengde + avstand[by][0]; < Lever p til videre bruk. > brukt[by] = false; lengde -= avstand[p[plass-1]][by]; float minlengde: korteste hittil 11

Alternativ generering av permutasjoner En mer direkte (og mer effektiv?) generering av permutasjoner. Initielt: Arrayen p inneholder de aktuelle elementene. Metoden permuter(i): Skal generere alle permutasjoner fra og med indeks i. Skal levere tilbake arrayen p slik den var da metoden ble kalt. 15

Initielt: p 0 1 2... n-1 Alle som begynner med 0: p 0 1 2... n-1 fast permuter(1) Alle som begynner med 1: p 1 0 2... n-1 fast permuter(1) Alle som begynner med 2: p 2 0 1... n-1 fast permuter(1) Alle som begynner med n-1: p n-1 0 1... n-2 fast permuter(1) 16

Direkte generering av permutasjoner // Startkall: permuter(0); void permuter(int i) { if (i == n 1) { < Lever p til videre bruk. > else { permuter(i + 1); for (int k = i + 1; k < n; k++) { bytt(i,k); permuter(i + 1); rotervenstre(i); 17

Hjelpemetodene bytt og rotervenstre void bytt(i,j) { int tmp = p[i]; p[i] = p[j]; p[j] = tmp; void rotervenstre(int i) { int tmp = p[i]; for (int k = i + 1; k < n; k++) { p[k 1] = p[k]; p[n-1] = tmp; 18

Repetisjon kombinatorisk søking Har: Et endelig antall elementer. Skal: Finne en rekkefølge, gjøre et utplukk, Del kravet i en enkel og en vrien del. Test mest mulig av det vriene kravet underveis. Kjenn igjen håpløse delløsninger så tidlig som mulig. 19