Kombinatorikai algoritmusok

Hasonló dokumentumok
Kombinatorikai algoritmusok. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Adatszerkezetek II. 10. előadás

Visszalépéses kiválogatás

Informatikai tehetséggondozás:

Algoritmizálás, adatmodellezés tanítása 7. előadás

Diszkrét matematika 1.

Diszkrét matematika 1.

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

Informatikai tehetséggondozás:

Biomatematika 2 Orvosi biometria

Hatékonyság 1. előadás

Felvételi tematika INFORMATIKA

Mohó stratégia. Feladat: Megoldás:

Osztályozóvizsga követelményei

Sorozatok I. Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma)

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

HHF0CX. k darab halmaz sorbarendezésének a lehetősége k! Így adódik az alábbi képlet:

Visszalépéses maximumkiválasztás

Nyugat-magyarországi Egyetem Geoinformatikai Kara. Prof. Dr. Závoti József. Matematika III. 1. MA3-1 modul. Kombinatorika

Adatszerkezetek II. 6. előadás

[Biomatematika 2] Orvosi biometria

TANMENET. a matematika tantárgy tanításához 11.E osztályok számára

Bevezetés a matematikába (2009. ősz) 1. röpdolgozat

Információk. Ismétlés II. Ismétlés. Ismétlés III. A PROGRAMOZÁS ALAPJAI 2. Készítette: Vénné Meskó Katalin. Algoritmus. Algoritmus ábrázolása

Definíció n egymástól megkülönböztethető elem egy sorrendjét az n elem egy (ismétlés nélküli) permutációjának nevezzük.

Adatbázis és szoftverfejlesztés elmélet. Programozási tételek

Közismereti informatika I. 4. előadás

Algoritmizálás, adatmodellezés tanítása 1. előadás

Adatszerkezetek. Nevezetes algoritmusok (Keresések, rendezések)

Backtrack-es feladat-variációk

Algoritmizálás, adatmodellezés tanítása 11. előadás. (Horváth Gyula előadása alapján)

Felvételi vizsga mintatételsor Informatika írásbeli vizsga

ELEMI PROGRAMOZÁSI TÉTELEK

2015, Diszkrét matematika

Multihalmaz, intervallumhalmaz

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

Tanmenet a évf. fakultációs csoport MATEMATIKA tantárgyának tanításához

Számelmélet Megoldások

Brósch Zoltán (Debreceni Egyetem Kossuth Lajos Gyakorló Gimnáziuma) Számelmélet I.

Matematika tanmenet 11. évfolyam (középszintű csoport)

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Kombinatorika jegyzet és feladatgyűjtemény

Bevezetés az algebrába az egész számok

Algoritmizálás, adatmodellezés tanítása 8. előadás

NT Matematika 11. (Heuréka) Tanmenetjavaslat

Osztályozóvizsga és javítóvizsga témakörei Matematika 9. évfolyam

Rekurzív algoritmusok

Diszkrét matematika I.

A 2017/2018 tanévi Országos Középiskolai Tanulmányi Verseny első fordulójának feladatai. INFORMATIKA II. (programozás) kategória

7! (7 2)! = 7! 5! = 7 6 5! 5 = = ből 4 elem A lehetőségek száma megegyezik az 5 elem negyedosztályú variációjának számával:

Analízis előadás és gyakorlat vázlat

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

Feladatmegoldási stratégiák

4. Sorozatok. 2. Igazoljuk minél rövidebben, hogy a következő egyenlőség helyes: 100 =

Hatványozás. A hatványozás azonosságai

Rekurzió. (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Rendezések. A rendezési probléma: Bemenet: Kimenet: n számot tartalmazó (a 1,a 2,,a n ) sorozat

PROGRAMOZÁSI TÉTELEK

24. tétel. Kombinatorika. A grá fok.

Bevezetés az algebrába 1

Programozási tételek. Dr. Iványi Péter

Számelmélet (2017. február 8.) Bogya Norbert, Kátai-Urbán Kamilla

Alkalmazott modul: Programozás. Programozási tételek, rendezések. Programozási tételek Algoritmusok és programozási tételek

Algoritmusok és adatszerkezetek I. 1. előadás

Informatikai tehetséggondozás:

Permutáció n = 3 esetében: Eredmény: permutációk száma: P n = n! romámul: permutări, angolul: permutation

Megoldás: Mindkét állítás hamis! Indoklás: a) Azonos alapú hatványokat úgy szorzunk, hogy a kitevőket összeadjuk. Tehát: a 3 * a 4 = a 3+4 = a 7

A 2016/2017 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

VÉLETLEN PERMUTÁCIÓ ELŐÁLLÍTÁSA

SZAMOKKAL Egy algoritmus generálja növekvő sorrendben, kizárólag a 3, 5 és 7 számjegyeket használva, az összes n számjegyű számot.

Diszkrét matematika I.

Problémamegoldási stratégiák

æ A GYAKORLAT (* feladatok nem kötelezőek)

A sorozat fogalma. függvényeket sorozatoknak nevezzük. Amennyiben az értékkészlet. az értékkészlet a komplex számok halmaza, akkor komplex

Algoritmizálás, adatmodellezés 1. előadás

Az értékelés a következők szerint történik: 0-4 elégtelen 5-6 elégséges 7 közepes 8 jó 9-10 jeles. A szóbeli vizsga várható időpontja

Fibonacci számok. Dinamikus programozással

5. Rekurzió és iteráció (Rekurzív programok átírása nemrekurzívvá)

Osztályozó- és javítóvizsga témakörei MATEMATIKA tantárgyból 2016 / tanév

Összetett programozási tételek Rendezések Keresések PT egymásra építése. 10. előadás. Programozás-elmélet. Programozás-elmélet 10.

Klasszikus algebra előadás. Waldhauser Tamás április 14.

Algoritmuselmélet 2. előadás

Informatikai tehetséggondozás:

Negatív alapú számrendszerek

9. előadás. Programozás-elmélet. Programozási tételek Elemi prog. Sorozatszámítás Eldöntés Kiválasztás Lin. keresés Megszámolás Maximum.

1.1. Definíció. Azt mondjuk, hogy a oszója b-nek, vagy más szóval, b osztható a-val, ha létezik olyan x Z, hogy b = ax. Ennek jelölése a b.

8. GYAKORLÓ FELADATSOR MEGOLDÁSA. (b) amelyiknek mindegyik számjegye különböző, valamint a második számjegy a 2-es?

Nagy Gábor compalg.inf.elte.hu/ nagy

Alkalmazott modul: Programozás. Programozási tételek, rendezések Giachetta Roberto

A 2015/2016 tanévi Országos Középiskolai Tanulmányi Verseny első forduló javítási-értékelési útmutató. INFORMATIKA II. (programozás) kategória

Amortizációs költségelemzés

Nagy Gábor compalg.inf.elte.hu/ nagy ősz

1. GONDOLKODÁSI MÓDSZEREK, HALMAZOK, KOMBINATORIKA, GRÁFOK

Kombinatorika - kidolgozott típuspéldák

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

Sorozatok határértéke SOROZAT FOGALMA, MEGADÁSA, ÁBRÁZOLÁSA; KORLÁTOS ÉS MONOTON SOROZATOK

INFORMATIKA javítókulcs 2016

SZÁMÉRTÉKEK (ÁT)KÓDOLÁSA

Rendezések. Sergyán Szabolcs Óbudai Egyetem Neumann János Informatikai Kar október 24.

Bizonyítási módszerek - megoldások. 1. Igazoljuk, hogy menden természetes szám esetén ha. Megoldás: 9 n n = 9k = 3 3k 3 n.

Átírás:

Kombinatorikai algoritmusok (Horváth Gyula és Szlávi Péter előadásai felhasználásával)

Kombinatorikai algoritmusok A kombinatorika: egy véges halmaz elemeinek valamilyen szabály alapján történő csoportosításával, kiválasztásával, sorrendbe rakásával foglalkozik (Wikipedia) Tipikus kombinatorikai feladatok: részhalmazok képzése összes felsorolása partícionálás céljából halmazfelbontás adott tulajdonságú (pl. adott számosságú) megadása 2/54

Kombinatorikai algoritmusok Tipikus kombinatorikai feladatok: halmazok számosságának a meghatározása halmazok (~sorozatok) felsorolása összes eleme halmazok (~sorozatok) valamely elemének generálása egy eleme szabályos sorrend szerinti i. elem adottra következő, előző véletlen elem 3/54

Kombinatorikai algoritmusok Kombinatorikai feladattípusok: permutációk (ismétlés nélküli, ismétléses) kombinációk (ismétlés nélküli, ismétléses) variációk (ismétlés nélküli, ismétléses) részhalmazok diszjunkt felbontások (N elemű halmaz diszjunkt felbontásai K halmazra, vagy természetes számra: N=x 1 + x k, ahol x i 0) partíciók (N elemű halmaz diszjunkt felbontásai, vagy természetes számra: N=x 1 + x m, ahol x i >0) 4/54

Ismétlés nélküli kombinációk Ismert képlet: az elemszám kiszámítása N K K! Rekurzív definíció 1: N elemből K elem választása az első elemet választjuk, majd még N-1 elemből választunk K-1 elemet. vagy az első elemet nem választjuk és a maradék N-1 elemből választunk K elemet. B(N,K)=B(N-1,K-1)+B(N-1,K). N! N K! K N N 1... 1 K 1... 1 N K N K 1... 1 5/54

az elemszám kiszámítása Ismétlés nélküli kombinációk B(N,K): Ha K=0 vagy K=N akkor B:=1 különben B:=B(N-1,K-1)+B(N-1,K) Függvény vége. De táblázatkitöltéssel hatékonyabb! Binom(N,K): Szélek feltöltése Ciklus i=1-től N-ig Ciklus j=1-től i-ig B(i,j):=B(i-1,j-1)+B(i-1,j) Eljárás vége. 6/54

az elemszám kiszámítása Ismétlés nélküli kombinációk Rekurzív definíció 2: N elemből K elem választása először kiválasztunk K-1 elemet, majd a maradék N-K+1 elemből kell egyet választani (de így minden kombináció pontosan K-féleképpen áll elő), tehát jön még egy K-val osztás B(N,K)=B(N,K-1)*(N-K+1)/K 7/54

az elemszám kiszámítása Ismétlés nélküli kombinációk B(N,K): Ha K=0 akkor B:=1 különben B:=B(N,K-1)*(N-K+1)/K Függvény vége. Táblázatkitöltéssel lényegében nem hatékonyabb! Binom(N,K): B(0):=1 Ciklus i=1-től N-ig B(i):=B(i-1)*(N-i+1)/i Függvény vége. 8/54

az elemszám kiszámítása Elsőfajú Euler számok E(n,k) az első n természetes szám azon permutációi száma, ahol pontosan k emelkedés van (emelkedés van az i-edik helyen, ha x i <x i+1 ). n-1 elem összes olyan permutációja, ahol pontosan k növekedés van: az n-edik számot a sorozat elejére vagy egy emelkedésbe tesszük; n-1 elem összes olyan permutációja, ahol pontosan k-1 emelkedés van: n-edik elemet a sorozat végére vagy egy nem emelkedő helyre tesszük. E n, k k 1 E n 1, k n k E n 1, k 1 9/54

az elemszám kiszámítása Másodfajú Euler számok E(n,k) az {1,1,2,2,,n,n} sorozat olyan permutációi száma, amelyekben tetszőleges m szám két előfordulása között csak náluk nagyobb szám fordulhat elő és pontosan k emelkedő részsorozata van. Vegyük észre, hogy amikor áttérünk n-1-ről n-re, akkor a két n-edik számot csak egymás mellé szúrhatjuk be! 10/54

az elemszám kiszámítása Másodfajú Euler számok n-1 elem összes olyan permutációja, ahol pontosan k növekedés van: az n-edik számpárt a sorozat elejére vagy egy emelkedésbe tesszük; n-1 elem összes olyan permutációja, ahol pontosan k-1 emelkedés van: n-edik számpárt a sorozat végére vagy egy nem emelkedő helyre tesszük (ebből 2*n-1-k van). E n, k k 1 E n, k 1 2n 1 k E n 1, k 1 11/54

az elemszám kiszámítása n\k 0 1 2 3 4 5 6 7 0 1 1 1 0 2 1 2 0 3 1 8 6 0 4 1 22 58 24 0 5 1 52 328 444 120 0 6 1 114 1452 4400 3708 720 0 7 1 240 5610 32120 58140 33984 5040 0 Zsakó László: Kombinatorika 2016.02.26. 9:46 12/54

az elemszám kiszámítása Ismétlés nélküli permutációk száma megszorítással minden elem a sorszám szerinti helyétől legfeljebb egyet távolodhat el Amikor a permutációk előállításában az I. elemnél tartunk, akkor két döntési lehetőségünk van: az I marad a helyén, majd permutációk I+1-től, az I+1 és az I helyet cserél, majd permutációk I+2-től. Permszám(X,n): Ha n<2 akkor Permszám:=n különben Permszám:=Permszám(n-1)+ Permszám(n-2) Eljárás vége. 13/54

az összes előállítása Összes ismétlés nélküli permutáció Backtrack: i (1 i n): j (1 j<i): X j X i Összes ismétlés nélküli kombináció Backtrack: i (1 i k): j (1 j<i): X j <X i Összes ismétléses kombináció Backtrack: i (1 i k): j (1 j<i): X j X i Összes partíció Olyan K-jegyű számok, ahol a számjegyek összege pontosan N. Összes diszjunkt felbontás N felbontása pozitív (>0) számok összegére. 14/54

az összes előállítása Összes ismétlés nélküli permutáció 1 2 3 N-1 N 1,2,3,,N-1,N 1,2,3,,N,N-1 N,1,2,3,,N-1 N,N-1,,3,2,1 15/54

az összes előállítása Összes ismétlés nélküli permutáció ciklussal Permutációk(N): i:=1; X():=(0,,0) Ciklus amíg i 0 és i N Ha vanjóeset(i,van,j) akkor Ha i=n akkor Kiír: X különben X(i):=j; i:=i+1 különben X(i):=0; i:=i-1 Eljárás vége. 16/54

az összes előállítása Összes ismétlés nélküli permutáció ciklussal vanjóeset(i,van,j): j:=x(i)+1 Ciklus amíg j N és rossz(i,j) j:=j+1 van:=j N Eljárás vége. 17/54

az összes előállítása Összes ismétlés nélküli permutáció ciklussal rossz(i,j): k:=1 Ciklus amíg k<i és j X(k) k:=k+1 rossz:=k<i Eljárás vége. 18/54

az összes előállítása Összes ismétlés nélküli permutáció rekurzív backtrack Az összes olyan szám-n-es előállítása visszalépéses kereséssel, ahol i j x i x j Perm(i,n,X,db,Y): Ha i=n+1 akkor db:=db+1; Y(db):=X különben Ciklus j=1-től n-ig Ha nem Rossz(i,j) akkor X(i):=j; Perm(i+1,n,X,Db,Y) Eljárás vége. 19/54

az összes előállítása Összes ismétlés nélküli permutáció rekurzív backtrack Rossz(i,j): k:=1 Ciklus amíg k<i és X(k) j k:=k+1 Rossz:=(k<i) Függvény vége. 20/54

az összes előállítása Összes ismétlés nélküli permutáció rekurzívan Ha N-1 elem összes permutációja kész, akkor szúrjuk be az N-et minden lehetséges helyre, mindegyikbe! Permutáció(x,i,n): Ha i>n akkor Ki: x különben x(i):=i; Permutáció(x,i+1,n) Ciklus j=i-1-től 1-ig -1-esével Csere(x(j),x(j+1)) Permutáció(x,i+1,n) Eljárás vége. 21/54

az összes előállítása Összes ismétlés nélküli permutáció megszorítással Az 1,,n sorozat összes olyan permutációját állítsuk elő, ahol minden elem maximum 1 hellyel mozdul el a helyéről, azaz i-1 X(i) i+1! A backtrack-es megoldást könnyű módosítani: Ciklus j=1-től n-ig helyett Ciklus j=i-1-től i+1-ig kell a programba! A rekurzív megoldást ezzel szemben újra kell gondolni! 22/54

az összes előállítása Összes ismétlés nélküli permutáció megszorítással Amikor a permutációk előállításában az I. elemnél tartunk, akkor két döntési lehetőségünk van: az I marad a helyén, majd permutációk I+1-től, az I+1 és az I helyet cserél, majd permutációk I+2-től. Permutáció(X,i,n): Ha i>n akkor Ki: X különben X(i):=i; Permutációk(X,i+1,n) Ha i<n akkor X(i):=i+1; X(i+1):=i Permutációk(X,i+2,n) Eljárás vége. 23/54

Feladat: Az összes permutáció alkalmazása Jól ismert fejtörő, amelyben egy aritmetikai művelet kapcsol egybe szavakat. A feladat az, hogy a szavak egyes betűinek feleltessünk meg egy számjegyet úgy, hogy a művelet helyes eredményt szolgáltasson a szavakon. Pl. SEND + MORE = MONEY. Megoldás: A szavakban előforduló jelekhez (SENDMORY) keressük a 0..9 számjegyek egyértelmű hozzárendelését. 24/54

Az összes permutáció alkalmazása 1. megoldási ötlet ( algebrai hozzáállás ): D+E=Y, N+R=E, M=1 D+E=10+Y, N+R+1=E, M=1 2. megoldási ötlet: Az összes permutáció algoritmusára építünk. A Jó eljárás ellenőrzi a permutáció a feladat szempontjából való helyességét, és gondoskodik az esetleges megoldás gyűjtéséről vagy kiírásáról. 25/54

Az összes permutáció alkalmazása A megfelelőség a (*) SEND + MORE MONEY = 0 egyenletre. Ha 'S X(1) értékű, akkor a (*)-ban X(1) *1000-rel van jelen; 'E' X(2) értékű, akkor X(2)*(100+1-10)=X(2)*91-gyel; 'N' X(3) értékű, akkor X(3)*(10-100)= X(3)*(-90)-nel; 'D' X(4) értékű, akkor X(4)*(1)-gyel; 'M' X(5) értékű, akkor X(5)*(1000-10000)=X(5)*(-9000)-rel; 'O' X(6) értékű, akkor X(6)*(100-1000)= X(6)*(-900)-zal; 'R' X(7) értékű, akkor X(7)*10-zel; 'Y' X(8) értékű, akkor X(8)*(-1)-gyel van jelen. továbbá az S és az M betűhöz nem rendelhetünk nullát, azaz X(1) 0 és X(5) 0! 26/54

Az összes permutáció alkalmazása Megoldás(i,n,X,db,Y): Ha i=n+1 és jó(x) akkor db:=db+1; Y(db):=X különben Ciklus j=0-tól 9-ig Ha nem Rossz(i,j) akkor X(i):=j; Megoldás(i+1,n,X,Db,Y) Eljárás vége. jó(x): jó:=(x(1) *1000+X(2)*91+X(3)*(-90)+X(4)*1+X(5)*(-9000)+ X(6)*(-900)+X(7)*10+X(8)*(-1)=0 és X(1) 0 és X(5) 0) Függvény vége. Ha a konstansokat egy Z vektorban tárolnánk, akkor a Jó függvényben X és Z skaláris szorzatát kellene kiszámolnunk. 27/54

Összes részhalmaz az összes előállítása Feleltessük meg a részhalmazokat kettes számrendszerbeli számoknak: {} 0...0000 {1} 0...0001 {2} 0...0010 {1,2} 0...0011 {3} 0...0100 {1,3} 0...0101 {2,3} 0...0110 {1,2,3} 0...0111 28/54

az összes előállítása Összes részhalmaz (kettes számrendszerbeli számként) Részhalmazok(n,Y): Ciklus i=0-tól 2 n -1-ig k:=i Ciklus j=1-től n-ig X(j):=k mod 2; k:=k div 2 Y(i+1):=X Eljárás vége. 29/54

az összes előállítása Összes részhalmaz (részhalmazként) Részhalmazok(n,Y): Ciklus i=0-tól 2 n -1-ig X.db:=0 Ciklus j=1-től n-ig Ha k mod 2=1 akkor X.db:=X.db+1; X.t(X.db):=j k:=k div 2 Y(i+1):=X Eljárás vége. 30/54

Összes ismétléses variáció Feleltessük meg a variációkat N alapú számrendszerbeli K jegyű számoknak! 1,...,1,1 0...0000 1,...,1,2 0...0001 1,...,1,n 0...001(n-1) 1,...,2,1 0...0010 1,...,2,n n,...,n,n az összes előállítása 0...001(n-1) (n-1)...(n-1) 31/54

az összes előállítása Összes ismétléses variáció Variációk(n,k,Y): Ciklus i=0-tól n k -1-ig m:=i Ciklus j=1-től n-ig X(j):=m mod n; m:=m div n Y(i+1):=X Eljárás vége. 32/54

Összes partíció Az N számot bontsuk fel az összes lehetséges módon K nemnegatív szám összegére! Felbontás(N): az összes előállítása X N X i, ahol X i 0 sorozatok halmaza, amelyek összege éppen N. A megoldások alakja: 1,x,,x 2,x,,x N,x,,x, azaz olyan X 33/54

az összes előállítása Összes partíció Felbontás(n,k,i,db,Y): Ciklus j=1-től n-1-ig X(i):=j; Felbontás(n-X(i),i+1) X(i):=n; X(i+1..k):=0 db:=db+1; Y(db):=X Eljárás vége. 34/54

Összes partíció Az N számot bontsuk fel az összes lehetséges módon K monoton csökkenő sorrendű nemnegatív szám összegére! Felbontás(N): az összes előállítása X N X i, ahol X i 0, azaz olyan X sorozatok halmaza, amelyek összege éppen N és. A megoldások alakja: 1,x,,x 2,x,,x N,x,,x X i X i 1 35/54

az összes előállítása Összes partíció Felbontás(n,k,i,db,Y): Ciklus j=1-től min(n-1,x(i-1))-ig X(i):=j; Felbontás(n-X(i),i+1) Ha X(i-1) n akkor X(i):=n; X(i+1..k):=0 db:=db+1; Y(db):=X Eljárás vége. 36/54

I-edik permutáció az I. előállítása Vegyük pl. a minimum-kiválasztásos rendezést! Jelentse F(j) a j-edik lépésbeli csere távolságát! Az F vektor alapján az eredeti sorrend visszaállítható! Minden i természetes számhoz (0 i<n!) különböző F vektor tartozik, az i szám felírása faktoriális számrendszerben. 37/54

Rendezés az I. előállítása Rendezés(n): Ciklusi=1-től n-ig min:=i Ciklus j=i+1-től n-ig Ha X(j)<X(min) akkor min:=j Csere(X(i),X(min)); Táv(i):=min-i Eljárás vége. 38/54

az I. előállítása Rendezés: a Táv vektor alapján az eredeti sorrend visszaállítható Rendezés vissza(n): Ciklus j=n-1-től 1-ig -1-esével Csere(x(j),x(j+Táv(j))) Eljárás vége. 39/54

A Táv vektor elemei: Táv(n-1) {0,1} Táv(n-2) {0,1,2} Táv(1) {0,1,,n-1} az I. előállítása Ez egy olyan n-1 számjegyből álló szám, amelynek helyiértékenként más a számrendszer alapszáma faktoriális számrendszer. 40/54

Az i-edik permutáció: az I. előállítása Az i felírása faktoriális számrendszerben, majd cserék. Permutáció(i,n): x:=(1,2,...,n); K:=2 Ciklus j=n-1-től 1-ig -1-esével t:=i mod K; i:=i div K Csere(x(j),x(j+t-1)) K:=K+1 Eljárás vége. Probléma: nem lexikografikus sorrend! 41/54

Az i-edik permutáció: az I. előállítása Tudjuk, hogy pontosan (n-1)! 1-gyel, 2-vel,... kezdődő permutáció van. Permutáció(i,n): x:=(1,2,...,n); i:=i-1; m:=n-1 Ciklus j=1-től n-1-ig k:=i div fakt(m); i:=i mod fakt(m) Eltol(j,k); m:=m-1 Eljárás vége. 42/54

Az i-edik permutáció, amelyben minden elem legfeljebb eggyel mozdulhatott el: Permutáció(i,n): m:=n-1; j:=1; Ciklus amíg j<n Ha i<fib(m) akkor x(j):=j; m:=m-1; j:=j+1 különben i:=i-fib(m); x(j):=j+1; x(j+1):=j m:=m-2; j:=j+2 Eljárás vége. az I. előállítása Tudjuk, hogy pontosan Fib(n-1) (1)-gyel, illetve Fib(n-2) (2,1)-gyel,... kezdődő ilyen permutáció van. 43/54

az I. előállítása Az i-edik ismétléses variáció: Az i felírása K alapú számrendszerben. Variáció(i,n,k): ciklus j=n-től 1-ig -1-esével x(j):=i mod k; i:=i div k ciklus vége Eljárás vége. 44/54

Az i-edik részhalmaz: az I. előállítása Az i felírása kettes számrendszerben. Részhalmaz(i,n): ciklus j=n-től 1-ig -1-esével x(j):=i mod 2; i:=i div 2 ciklus vége Eljárás vége. 45/54

Következő permutáció a következő előállítása X 1, X i, X i+1, X n rákövetkezője, ha X i+1, X n monoton csökkenő és X i <X i+1 : X 1, X i-1, a régi X i -nél nagyobbak közül a legkisebb, majd a többiek monoton növekvően. Példa: X X X 4 7 5 3 X X X 5 3 4 7 46/54

Következő permutáció a következő előállítása Következő(P): i:=n Ciklus amíg i>0 és P(i)<P(i-1) S(i):=P(i); i:=i-1 Ha i>0 akkor 47/54

a következő előállítása Ha i>0 akkor j:=n Ciklus amíg P(j)<P(i) j:=j-1 S(j):=P(i); P(i):=P(j); j:=n Ciklus amíg i<n i:=i+1; P(i):=S(j); j:=j-1 Eljárás vége. 48/54

Előző permutáció a következő előállítása X 1, X i, X i+1, X n rákövetkezője, ha X i+1, X n monoton növekvő és X i >X i+1 : X 1, X i-1, a régi X i -nél kisebbek közül a legnagyobb, majd a többiek monoton csökkenően. Példa: X X X 5 3 4 7 X X X 4 7 5 3 49/54

Előző permutáció a következő előállítása Következő(P): i:=n Ciklus amíg i>0 és P(i)>P(i-1) S(i):=P(i); i:=i-1 Ha i>0 akkor 50/54

a következő előállítása Ha i>0 akkor j:=n Ciklus amíg P(j)>P(i) j:=j-1 S(j):=P(i); P(i):=P(j); j:=n Ciklus amíg i<n i:=i+1; P(i):=S(j); j:=j-1 Eljárás vége. 51/54

HALADÓ!!!!! Kombinatorikai algoritmusok A binomiális együtthatók felhasználhatók számok speciális számrendszerben, az un. binomiális számrendszerben való felírására. Rögzített m esetén minden nemnegatív n szám egyértelműen felírható az alábbi formában: n a 1 1 a2 2 am... m 0 1 2 a a... a m, ahol. 52/54

Kombinatorikai algoritmusok HALADÓ!!!!! A Zeckendorf tétel alapján minden természetes szám egyértelműen előállítható Fibonacci számok összegeként úgy, hogy n F F... F k 1 k ahol i 1 i r : k i k i 1 2, és k r 2. A Fibonacci számokat az alábbi képlettel számolhatjuk: F k F k 2 k r 0 ha k 0 1 ha k 1 1 Fk 2 ha k 1 53/54

Kombinatorikai algoritmusok előadás vége