Backtracking: Kombinatorikk og permutasjoner

Like dokumenter
Backtracking som løsningsmetode

Backtracking som løsningsmetode

Kapittel 3: Kombinatorikk

Kapittel 3: Kombinatorikk

Forelesning 6, kapittel 3. : 3.6: Kombinatorikk.

Sannsynlighetsregning

INF2220: Forelesning 7. Kombinatorisk søking

En algoritme for permutasjonsgenerering

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

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

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

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

UNIVERSITETET I OSLO

INF1010 Sortering. Marit Nybakken 1. mars 2004

INF1010 Rekursjon. Marit Nybakken 1. mars 2004

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

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

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

UNIVERSITETET I OSLO

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

Hva er en stack? En lineær datastruktur der vi til enhver tid kun har tilgang til elementet som ble lagt inn sist

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

UNIVERSITETET I OSLO

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

Kombinatorisk søking, rekursjon, avskjæring

Datastrukturer for rask søking

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

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

b) Hvis det er mulig å svare blankt (dvs. vet ikke) blir det 5 svaralternativer på hvert spørsmål, og dermed mulige måter å svare på.

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

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

UNIVERSITETET I OSLO

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

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

Rekursiv programmering

Algoritmer og datastrukturer Løsningsforslag

Programmering Høst 2017

Rekursjon som programmeringsteknikk

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

IN1010 våren januar. Objektorientering i Java

UNIVERSITETET I OSLO

Endret litt som ukeoppgave i INF1010 våren 2004

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

OPPGAVE 5b og 8b Java Kode

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Permutasjoner og utvalg

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

UNIVERSITETET I OSLO

Norsk informatikkolympiade runde

Algoritmer og Datastrukturer

Norsk informatikkolympiade runde

UNIVERSITETET I OSLO

INF1010 våren januar. Objektorientering i Java

MAT1030 Diskret Matematikk

Stack. En enkel, lineær datastruktur

Norsk informatikkolympiade runde

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

UNIVERSITETET I OSLO

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

INF1000. Marit Nybakken 10. februar 2004

UNIVERSITETET I OSLO

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

Quicksort. Fra idé til algoritme.

Informasjon Eksamen i IN1000 høsten 2017

INF1000 Behandling av tekster

TDT4100 Objektorientert programmering

BOKMÅL Side 1 av 5. KONTERINGSEKSAMEN I FAG TDT4102 Prosedyre og objektorientert programmering. Onsdag 6. august 2008 Kl

Algoritmer og Datastrukturer

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

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

public static <returtype> navn_til_prosedyre(<parameter liste>) { // implementasjon av prosedyren

UNIVERSITETET I OSLO

INF1000 (Uke 15) Eksamen V 04

INF1000 (Uke 15) Eksamen V 04

Eksamensoppgave i IFUD1025 Programmering i Java og IINI4013 Programmering i Java

Kapittel 9: Sortering og søking Kort versjon

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

Forelesning inf Java 5

Oppgave 1. Sekvenser (20%)

Forelesning inf Java 5

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

Dagens tema Kapittel 8: Objekter og klasser

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

Dagens tema INF1010 INF1010 INF1010 INF1010

Obligatorisk oppgave 5: Labyrint

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

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

INF Algoritmer og datastrukturer

Generelle Tips. INF Algoritmer og datastrukturer. Åpen og Lukket Hashing. Hashfunksjoner. Du blir bedømt etter hva du viser at du kan

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

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

INF Uke 10. Ukesoppgaver oktober 2012

Transkript:

Backtracking: Kombinatorikk og permutasjoner

Litt kombinatorikk Kombinatorikk: Metoder og formler for å telle opp antall mulige måter som vi kan gjennomføre steg-for-steg prosesser på Eksempler: Hvor mange ulike LOTTO-rekker finnes det? Hvor mange forskjellige flush kan vi få utdelt i poker? Hvor mange ulike oppstillinger av dronninger kan vi lage på et sjakkbrett, slik at ingen står i samme rad eller kolonne? Kjennskap til grunnleggende formler fra kombinatorikken er nødvendig for å kunne forstå kompleksiteten i en del backtrackingproblemer

Multiplikasjonsprinsippet En prosess består av å gjøre n (del)valg i rekkefølge I hvert delvalg har vi ki ulike alternativer, i = 1, 2,, n Hele prosessen kan da utføres på: k 1 k 2 k 3 k n-1 k n ulike måter

Multiplikasjonsprinsippet: Et eksempel Skal velge et antrekk som består av en bukse og en genser n = 2 delvalg k1 = 3 bukser k2 = 2 gensere Totalt: k 1 k 2 = 3 2 = 6 mulige ulike antrekk

Et eksempel til: Svenske bilskilt Vanlige svenske registreringsnumre for biler består av tre bokstaver etterfulgt av tre siffer (0 9) Bokstavene I, Q, V, Å, Ä, Ö brukes ikke pga. at de ligner for mye på andre bokstaver/tall I alt 23 ulike bokstaver kan velges Det er 97 tre-bokstavskombinasjoner som ikke er tillatt å bruke

Antall forskjellige svenske bilskilt n = 6 delvalg Tre valg av bokstaver, 23 ulike muligheter i hvert valg: k 1 = k 2 = k 3 = 23 Tre valg av siffer, 10 ulike muligheter i hvert valg: k 4 = k 5 = k 6 = 10 Antall ulike skilt som inneholder ulovlige bokstavkoder: 97 10 10 10 = 97 000 Totalt antall forskjellige svenske bilskilt som kan lages: 23 23 23 10 10 10 97 000 = 12 070 000

Permutasjoner Har n objekter som alle er ulike Objektene skal stilles opp i en eller annen rekkefølge Det å bestemme en rekkefølge kan sees på som å nummerere objektene fra 1 til n En slik nummerering av n objekter kalles for en permutasjon av objektene Å endre rekkefølger kalles å permutere (eller å stokke om, bytte om) I mange backtrackingsproblemer vil løsningen være en permutasjon som oppfyller visse krav

Permutasjoner, noen eksempler Alle 6 permutasjoner av 123: 123 132 213 231 312 321 Alle 24 permutasjoner av ABCD: ABCD ABDC ACBD ACDB ADBC ADCB BACD BADC BCAD BCDA BDAC BDCA CABD CADB CBAD CBDA CDAB CDBA DABC DACB DBAC DBCA DCAB DCBA

Hvor mange permutasjoner kan lages? Kan bruke multiplikasjonsprinsippet til å regne ut antall mulige ulike permutasjoner av n objekter En permutering er en prosess med n delvalg: Velg nr. 1 : n muligheter Velg nr. 2 : n 1 muligheter Velg nr. n - 1 : 2 muligheter Velg nr. n : 1 mulighet Total antall mulige permutasjoner av n objekter: n (n - 1) (n - 2) 3 2 1 = n! (n-fakultet)

Antall permutasjoner vokser raskt 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120 6! = 720 7! = 5040 8! = 40320 9! = 362880 10! = 3628800 11! = 39916800 12! = 479001600 13! = 6227020800 14! = 87178291200 15! = 1307674368000 16! = 20922789888000 17! = 355687428096000 18! = 6402373705728000 19! = 121645100408832000 20! = 2432902008176640000

Hvordan lage og skrive ut alle permutasjoner? Ønsker å lage et Java-program som genererer og skriver ut alle permutasjoner av 1, 2, 3,, n Permutasjonene skal lages systematisk og i stigende rekkefølge Kan bruke et slikt program som utgangspunkt for å løse en rekke backtrackingproblemer, inkludert dronningproblemet Lager først et program som kan lage alle sekvenser av tallene 1,2, 3,, n

Alle sekvenser av n = 3 tall 3³ = 27 ulike sekvenser Bare 3! = 6 av disse er permutasjoner: 111 112 113 121 122 123 131 132 133 211 212 213 221 222 223 231 232 233 311 312 313 321 322 323 331 332 333 Java-program som lager alle sekvenser av 123: sekvens_3.java

N = 4: 4 ⁴ = 256 sekvenser, 4! = 24 permutasjoner 1111 1112 1113 1114 1121 1122 1123 1124 1131 1132 1133 1134 1141 1142 1143 1144 1211 1212 1213 1214 1221 1222 1223 1224 1231 1232 1233 1234 1241 1242 1243 1244 1311 1312 1313 1314 1321 1322 1323 1324 1331 1332 1333 1334 1341 1342 1343 1344 1411 1412 1413 1414 1421 1422 1423 1424 1431 1432 1433 1434 1441 1442 1443 1444 2111 2112 2113 2114 2121 2122 2123 2124 2131 2132 2133 2134 2141 2142 2143 2144 2211 2212 2213 2214 2221 2222 2223 2224 2231 2232 2233 2234 2241 2242 2243 2244 2311 2312 2313 2314 2321 2322 2323 2324 2331 2332 2333 2334 2341 2342 2343 2344 2411 2412 2413 2414 2421 2422 2423 2424 2431 2432 2433 2434 2441 2442 2443 2444 3111 3112 3113 3114 3121 3122 3123 3124 3131 3132 3133 3134 3141 3142 3143 3144 3211 3212 3213 3214 3221 3222 3223 3224 3231 3232 3233 3234 3241 3242 3243 3244 3311 3312 3313 3314 3321 3322 3323 3324 3331 3332 3333 3334 3341 3342 3343 3344 3411 3412 3413 3414 3421 3422 3423 3424 3431 3432 3433 3434 3441 3442 3443 3444 4111 4112 4113 4114 4121 4122 4123 4124 4131 4132 4133 4134 4141 4142 4143 4144 4211 4212 4213 4214 4221 4222 4223 4224 4231 4232 4233 4234 4241 4242 4243 4244 4311 4312 4313 4314 4321 4322 4323 4324 4331 4332 4333 4334 4341 4342 4343 4344 4411 4412 4413 4414 4421 4422 4423 4424 4431 4432 4433 4434 4441 4442 4443 4444

Antall sekvenser av n tall Multiplikasjonsprinsippet gir antall sekvenser av n tall: n delvalg, ett for hvert siffer I sekvensen n alternativer I hvert delvalg Totalt antall ulike sekvenser: n n n n = n n Vanskelig (umulig?) å skrive et generalt iterativt program for å lage alle sekvenser for vilkårlig n: Java-program som lager alle sekvenser av 12345: sekvens_5.java

Rekursivt program for å lage og skrive ut alle sekvenser av tallene 1, 2,, n Sekvensene bygges opp systematisk og rekursivt, ved at vi etter tur setter alle tallene inn som nummer en, deretter som nummer to osv. Bruker en global heltallsarray p av lengde n til å lagre alle sekvensene etterhvert som de genereres Rekursjonen følger indeksene i p

public static void lagsek(int indeks) { if (indeks == n) skrivsek(); else { for (int i = 0; i < n; i++) { p[indeks] = i + 1; lagsek(indeks + 1); } } } Java-kode med testprogram: sekvens.java

Program for å lage og skrive ut alle permutasjoner av tallene 1, 2,, n Permutasjonene bygges opp systematisk og rekursivt, ved at vi etter tur setter alle tallene inn som nummer en, deretter som nummer to osv. Bruker en global heltallsarray p av lengde n til å lagre permutasjonene som genereres Rekursjonen følger indeksene i p Tar vare på hvilke av tallene 1, 2,.., n som allerede er brukt i en permutasjon, i en global boolsk array brukt, (initielt lik false) slik at vi ikke setter inn samme tall to ganger

public static void lagperm(int indeks) { if (indeks == n) skrivperm(); else { for (int i = 0; i < n; i++) { if (!brukt[i]) { p[indeks] = i + 1; brukt[i] = true; lagperm(indeks + 1); brukt[i] = false; } } } } Java-kode med testprogram: permutasjon.java