Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék 2010 Kombinatorikai algoritmusok.

Slides:



Advertisements
Hasonló előadás
I. előadás.
Advertisements

Programozási feladatok
Valószínűségszámítás
Függvények Egyenlőre csak valós-valós függvényekkel foglalkozunk.
Matematika és Tánc Felkészítő tanár: Komáromi Annamária
Eseményalgebra, kombinatorika
Programozási alapismeretek 5. előadás. ELTE Szlávi - Zsakó: Programozási alapismeretek 5.2/  Programozási tételek.
Algebrai specifikációk Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
INFOÉRA Kombinatorikai algoritmusok (Horváth Gyula és Szlávi Péter előadásai felhasználásával) Juhász István-Zsakó László: Informatikai.
INFOÉRA 2006 Kombinatorika
Rekurzió (Horváth Gyula és Szlávi Péter előadásai felhasználásával)
Copyright, 2009 © Szlávi Péter A kupac és a prioritási sor típuskonstrukciók Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
4. VÉGES HALMAZOK 4.1 Alaptulajdonságok
Programozási alapismeretek 3. előadás
Programozási alapismeretek 10. előadás
Programozási alapismeretek 5. előadás. ELTE 2/  Programozási tételek – a lényeglényeg  Sorozatszámítás Sorozatszámítás.
Programozási alapismeretek 8. előadás. ELTE 2/  További programozási tételek További programozási tételek 
Programozási alapismeretek 11. előadás. ELTE Horváth-Papné-Szlávi-Zsakó: Programozási alapismeretek 11.2/ Tartalom.
4. előadás (2005. március 8.) Pointerek Pointer aritmetika
MATEMATIKA e-tananyag 9. osztály
Készítette: Pető László
permutáció kombináció variáció
Permutáció, variáció, kombináció
Készítette: Balogh Zsófia
Papp Róbert, Blaskovics Viktor, Hantos Norbert
A digitális számítás elmélete
Eseményalgebra, kombinatorika
Fák, bináris fák INFOÉRA Ez így 60 perc.
ELTE Szlávi-Zsakó: Programozási alapismeretek 8.1/ Kiválogatás Specifikáció:  Bemenet: N:Egész, X:Tömb[1..N:Valami]
ELTE Szlávi-Zsakó: Programozási alapismeretek 10.1/ Összegzés mátrixra Feladat: Egy mátrix elemeinek összege.
C++ Alapok, első óra Elemi típusok Vezérlési szerkezetek
Copyright, 1999 © Szlávi Péter Verem típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
A számfogalom bővítése
Halmazok Összefoglalás.
Valószínűségszámítás
Félévi típus feladatok
Lénárt Szabolcs Páll Boglárka
Kombinatorika Véges halmazok.
Tömbök és programozási tételek
KOMBINÁCIÓK ISMÉTLÉS NÉLKÜLI ESET DEFINÍCIÓ
Algoritmus szerkezetek
Programozási alapismeretek 11. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 11.2/ Tartalom  Rendezési.
Nevezetes algoritmusok
Algoritmusok.
Gráfok 1. Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék
Copyright, 1999 © Szlávi Péter Sor típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
I. előadás.
1. MATEMATIKA ELŐADÁS Halmazok, Függvények.
Algoritmizálás, adatmodellezés tanítása 8. előadás.
TMBONKIKRAOAI ANTMOKIKRAOBI MONKBIIKRATOA BIOMKANAKTOIR OMKBNRAITOIKA
Feladatok (értékadás)
Programozás, programtervezés
Összeállította: Sashalmi Tibor
Programozási alapismeretek 8. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 8.2/  További programozási.
Programozási alapismeretek 10. előadás. ELTE Szlávi-Zsakó: Programozási alapismeretek 10.2/  Kiválogatás + összegzés.
Mohó algoritmusok Szlávi Péter ELTE IK
Algoritmusok és Adatszerkezetek Egy kifejezés lengyelformára hozása - bemutató.
Programozási alapismeretek 11. előadás
Összeállította: Gergely János
Geometriai feladatok programozása Geometriai programozás Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék 2010.
INFOÉRA Gráfok, gráfalgoritmusok II. (Horváth Gyula és Szlávi Péter előadásai felhasználásával) Juhász István-Zsakó László: Informatikai.
KÉSZÍTETTE: KOVÁCSICS KRISZTIÁN
Programozási alapismeretek 4. előadás. ELTE  Programozási tételek – a lényeglényeg  Sorozatszámítás – összegzés… Sorozatszámítás  Megszámolás.
TÁMOP /1-2F Informatikai gyakorlatok 11. évfolyam Alapvető programozási tételek megvalósítása Czigléczky Gábor 2009.
Nevezetes algoritmusok
II. konzultáció Analízis Sorozatok Egyváltozós valós függvények I.
Halmazműveletek.
Programozási nyelvek alapfogalmai
Informatikai gyakorlatok 11. évfolyam
Algoritmus készítés.
Előadás másolata:

Szlávi Péter ELTE IK Média- és Oktatásinformatika Tanszék 2010 Kombinatorikai algoritmusok

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok2/50 Bevezetés 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)Wikipedia Tipikus témái (SzlaviPedia) : 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ő „véletlen” elem

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok3/50 Bevezetés Tipikus témái (folytatás) : részhalmazok képzése összes felsorolása partíciónálás céljából – halmazfelbontás adott tulajdonságú (pl. adott számosságú) megadása …

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok4/50 Amiről szó lesz – Tartalom Az összes … előállítása Ismétlés nélküli permutációk Ismétlés nélküli kombinációk Részhalmazok Az i. … előállítása Ismétlés nélküli permutáció Ismétléses variáció Véletlen algoritmusok Véletlen permutáció – „keverés” Véletlen kombináció          

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok5/50 Megjegyzések Az összes… : általában csak megoldási keretül szolgál valamely konkrét feladathoz; célja: a feladatnak megfelelő szempontból való feldolgozáshoz „szolgáltatja” az elemeket. (L. később: xxxFeldolg eljárást!) Az alaphalmaz = 1..N közötti természetes számok! Nyilvánvaló: nem jelent tényleges megszorítást!

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok6/50 Az összes … – Permutáció Ismétlés nélküli permutációk – A cél: N elem összes permutációjának előállítása … N-1 N 1,2,3,…,N-1,N 1,2,3,…,N,N-1 … N,1,2,3,…,N-1 …

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok7/50 Az összes … – Permutáció Egy naiv megvalósítás: N elem összes N-elemű ismétléses variációja + szűrés ? Konstans MaxN:Egész(?) Típus TPerm=Tömb(1..MaxN:Egész) A „főszereplő” típus defi- niálása. Eljárás ÖsszesPermutáció(Konstans N:Egész): 1,…,1 Konstans P1:TPerm(1,…,1) [MaxN darab 1-es] Változó permSorsz,i:Egész P:TPerm [aktuális permutáció] A lényegi eljárás szignatúrája és lokális adatainak dekla- rálása. P1 az első permutáció. permSorsz:=0 P:=P1; i:=N A ciklus előkészítése. Ciklus amíg i>0 Ha PermutációE(P) akkor permSorsz:+1; PermFeldolg(P,N,permSorsz) Elágazás vége A sorozat szűrése és a –per- mutáció esetén– feldolgozása. Ciklus amíg i>0 és P(i)=N P(i):=1; i:-1 Ciklus vége Ha i>0 akkor P(i):+1; i:=N A következő variáció elő- állítása Ciklus vége Eljárás vége. A ciklusból kiléptünk, amikor az NN…N-t is túlhaladtuk. Ez kézenfekvő algoritmusú

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok8/50 Az összes … – Permutáció Egy naiv megvalósítás (folytatás) : N elem összes N-elemű ismétléses variációja + szűrés Hatékonyság: az „érdekes” elemek számaránya: N!/N N  0 Függvény PermutációE(Konstans P:TPerm):Logikai Változó i,j:Egész mégOK:Logikai A permutáció-ságot vizsgáló függvény szignatúrája és lokális adatainak deklarációja. i:=2; mégOK:=Igaz Ciklus amíg i  N és mégOK Van-e olyan P(i:2..N), amely előtt már volt belőle? j:=1 Ciklus amíg j<i és P(j)  P(i) j:+1 Ciklus vége mégOK:=j=i i:+1 Az i. valamelyik előzőnek a duplikátuma-e? Ciklus vége PermutációE:=mégOK Függvény vége.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok9/50 Az összes … – Permutáció Egy backtrack alapú megvalósítás: A legfelsőbb szint: Eljárás ÖsszesPermutáció(Konstans N:Egész): Konstans X0:TPerm(0,…,0) [MaxN darab 0-ás] Típus TKeresett=Rekord(van:Logikai; melyik:Egész) Változó i:Egész X:TPerm [aktuális permutáció] ker:TKeresett permSorsz:Egész … A lényegi eljárás fejsora és lokális adatainak deklarációja. A permSorsz változó kódolásánál ügyelni kell arra, hogy viszonylag nagy egész számok fognak belekerülni.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok10/50 Az összes … – Permutáció Egy backtrack alapú megvalósítás (folytatás) : A legfelsőbb szint (folytatás): … permSorsz:=0 i:=1; X:=X0 Ciklus amíg i  1 A megszokott backtrack ciklus inicializáló része. A permSorsz a „kiválogatásos” variációhoz tartozik. Ha i>N akkor permSorsz:+1 PermFeldolg(X,N,permSorsz) i:-1 Elágazás vége Ha összeállt egy helyes permutá- ció, akkor következhet a feldolgozása (pl. a megjegyzése, most a PermFeldolg eljárás hívása). ker:=JóElem(i) Ha ker.van akkor X(i):=ker.melyik; i:+1 különben X(i):=0; i:-1 Elágazás vége Továbblépünk a következő permu- táció felé, vagy visszalépünk a backtrack logikája szerint. Ciklus vége Eljárás vége.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok11/50 Az összes … – Permutáció Egy backtrack alapú megvalósítás (folytatás) : A JóElem fv: A LehetségesE fv: Függvény JóElem(Konstans i:Egész):TKeresett Változó j:Egész j:=X(i)+1 Ciklus amíg j  N és nem LehetségesE(i,j) j:+1 Ciklus vége JóElem.van:=j  N Ha JóElem.van akkor JóElem.melyik:=j Függvény vége. Függvény LehetségesE(Konstans i,j:Egész):Logikai Változó k:Egész k:=1 Ciklus amíg k<i és X(k)  j k:+1 Ciklus vége LehetségesE:=k=i Függvény vége.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok12/50 Az összes … – Permutáció Egy rekurzív megvalósítás: Algoritmus: 0,…,0 Konstans [globális] P0:TPerm(0,…,0) [MaxN darab 0-ás] Változó [globális] permSorsz:Egész Globálisan deklarált permSorsz a végeredmény szempontjából, a P0 az „indulás” szempontjából fontos. Eljárás ÖsszesPermutáció(Konstans aktP:TPerm, i,n:Egész): Változó j:Egész P:TPerm(aktP) [kezdőértékadás] Ha i>n akkor permSorsz:+1; PermFeldolg(P,n,permSorsz) Az aktP n-ed rendű permutációjából kiindulva, generáljuk a következő i. komponensét. Nincs n-nél nagyobb komponens, elkészült a permutáció, feldolgozható. különben P(i):=i; ÖsszesPermutációk(P,i+1,n) Ciklus j=i-1-től 1-ig -1-esével Csere(P,j,j+1); ÖsszesPermutáció(P,i+1,n) Ciklus vége Elágazás vége Eljárás vége. Még nincs kész. Generáljuk az összes olyant, amelyek i. komponense i, majd cserékkel permutáljuk a kezdő- szeleteket, és a hozzájuk tartozó összes permutációt generáljuk. … permSorsz:=0; ÖsszesPermutáció(P0,1,N) … Az elindulás…

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok13/50 Az összes … – Permutáció Egy feladat : Jól ismert fejtörő, amelyben egy aritmetikai művelet kapcsol egybe szavakat. A feladat az, hogy a szavak egyes betűinek feletessü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 0..9 számjegyek egyértelmű hozzárendelését. 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 … és még sok hasonló egyenletrendszer

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok14/50 Az összes … – Permutáció 2. megoldási ötlet: Az összes permutáció algoritmusára építünk. A PermFeldolg eljárás ellenőrzi a permutáció –a feladat szem- pontjából való– helyességét, és gondoskodik az esetleges megol- dás gyűjtéséről vagy kiírásáról. A megfelelőség: a (*) SEND + MORE – MONEY = 0 egyenletre Ha 'S' s értékű, akkor a (*)-ban s*1000-rel van jelen; 'E' e értékű, akkor e*( )=e*91-gyel; 'N' n értékű, akkor n*(10-100)=n*(-90)-nel; 'D' d értékű, akkor d*(1)-gyel; 'M' m értékű, akkor m*( )=m*(-9000)-rel; 'O' o értékű, akkor o*( )=o*(-900)-zal; 'R' r értékű, akkor r*(10)=r*(10)-zel; 'Y' y értékű, akkor y*(-1)-gyel van jelen.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok15/50 Az összes … – Kombináció K Ismétlés nélküli kombinációk – A cél: N elem összes K-elemű kombinációjának előállítása … K-1 K 1,2,3,…,K-1,K +1 1,2,3,…,K-1,K+1 … N 1,2,3,…,K-1,N … K-1 K K+1 1,2,3,…,K,K ,2,3,…,K,K+2 … N 1,2,3,…K,N … 1 2 … K N-K+1N-+2,…,N N-K+1,N-K+2,…,N

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok16/50 Az összes … – Kombináció A backtrack alapú megvalósítás: Egy(etlen) probléma: a csak az elemek sorrendjében különböző K-asakat egyszer szabad figyelembe venni Megoldás (backtrack-es alapon) : csak rendezett sorozatokat generálunk legfelsőbb szinten lényegi változás alig van:  az azonosítókat értelemszerűen átírjuk;  az eljárás fejsora bővül a K paraméterrel;  a TKomb típus most is MaxN elemű, de csak az első K elemére lesz szükség;  a KombFeldolg eljárásnak átadjuk a K paramétert is…

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok17/50 Az összes … – Kombináció A backtrack alapú megvalósítás (folytatás) :  „érdemi” módosítás a K-ad osztályúság felismerése: A legfelsőbb szint: Eljárás ÖsszesKombináció(Konstans N,K:Egész): Konstans X0:TKomb(0,…,0) Típus TKeresett=Rekord(van:Logikai; melyik:Egész) Változó i:Egész X:TKomb [aktuális kombináció] ker:TKeresett kombSorsz:Egész A lényegi eljárás fejsora és lokális adatainak deklarációja. A kombSorsz változó kódolásánál ügyelni kell arra, hogy viszonylag nagy egész számok fognak belekerülni.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok18/50 Az összes … – Kombináció A backtrack alapú megvalósítás (folytatás) : A legfelsőbb szint (folytatás) : kombSorsz:=0 i:=1; X:=X0 Ciklus amíg i  1 A megszokott backtrack ciklus inicia- lizáló része. A kombSorsz a „kiváloga- tásos” változathoz tartozik. Ha i>K akkor kombSorsz:+1 KombFeldolg(X,N,K,kombSorsz) i:-1 Elágazás vége Ha összeállt egy helyes kombináció, akkor következhet a feldolgozása (pl. a megjegyzése, most a KombFeldolg eljárás hívása). ker:=JóElem(i) Ha ker.van akkor X(i):=ker.melyik; i:+1 különben X(i):=0; i:-1 Elágazás vége Tovább lépünk a következő kombi- náció felé, a backtrack logikája szerint. Ciklus vége Eljárás vége.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok19/50 Az összes … – Kombináció A backtrack alapú megvalósítás (folytatás) : A JóElem fv: változatlan, bár optimalizálható a szigorúan növekedés feltétel figyelembe vételével A LehetségesE fv: döntse el, hogy választható-e (azaz egyedi-e és növekvő-e) az i. elemként kijelölt j érték” Függvény LehetségesE(Konstans i,j:Egész):Logikai LehetségesE:=X(i-1)<j Függvény vége.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok20/50 Az összes … – Részhalmaz A cél: N elem összes részhalmazainak az előállítása 1. megoldásötlet : Kapcsolat: N-elemű halmaz K-elemű részhalmazai  N elem K-ad osztályú kombinációk Algoritmus: előző kombinációkat előállító backtrack-es változat Ábrázolás: az első 0-ig tartó (kezdő) részsorozat (a 0 illegális érték!); pl. (0,…,0) ~ üres (rész)halmaz; (1,2,…,N,0,…) ~ a „teli”…

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok21/50 Az összes … – Részhalmaz Az algoritmus: Eljárás ÖsszesRészhalmaz(Konstans N:Egész): … Változó K:Egész rhk:TRészHalmazok kombSorsz:Egész [  részhalmaz-sorszám] … A lényegi eljárás fejsora és lokális adatainak deklarációja. Az rhk-ban gyüjtjük a részhalma- zokat. Eljárás ÖsszesKombináció(Konstans N,K:Egész): … Eljárás vége. Ez a lokális eljárás előállítja N elem összes K-elemű részhalmazát. A kombSorsz-ot nem ő inicializálja. rhk(1):=X0 [üres halmaz] kombSorsz:=1 Ciklus K=1-től N-1-ig ÖsszesKombináció(N,K) Ciklus vége rhk(kombSorsz):=(1,2,…,N,0,…) [„teli” halmaz] Eljárás vége. Első az üres részhalmaz. A kombSorsz inicializálása után megszervezi minden K-ra a K-elemű részhalmazok generálását. Végül a „teli” részhalmaz. A „0,…” je-lentése: MaxN-ig kiegészítendő. Probléma : a K-eleműek képzése során minden K-nál kisebb elemszámú részsorozat újrakészül – hatékonyság!

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok22/50 Az összes … – Részhalmaz A probléma „lágy” megoldása: az N-elemű „részsorozat” előállítása közben, „bal- kézről” létrejövő kezdő részsorozatokat menetköz- ben gyártjuk; ügyelni kell arra, hogy mikor „kiáltunk ki” egy kezdő részsorozatot részhalmaznak: csak „előrefelé” hala- dáskor (visszalépéskor nem lehet!)

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok23/50 Az összes … – Részhalmaz 2. megoldásötlet: Ábrázolás: THalmaz=Tömb(1..N:Logikai) h:THalmaz  h(i)=Igaz  az i. elem a h-nak eleme vagy THalmaz = Egész Igaz=1 / Hamis=0  N jegyű bináris szám  [0..2 N –1] h:THalmaz  (h Div 2 i-1 ) Mod 2=1  az i. elem a h-nak eleme

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok24/50 Az összes … – Részhalmaz 2. megoldásötlet (folytatás) : Algoritmus: Felsorolni 0..2 N -1 számot, azaz N elem összes ismétléses variációját. Furcsaság (?): 1. megoldás: N elem összes ismétlés nélküli kombináció- ja (ra építettük) 2. megoldás: 2 elem összes ismétléses variációja Emlékeztető: = 2 N

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok25/50 Az i. … előállítása Feladatspecialitás: olyankor lehet az i. előállítására szükség, amikor a programban az i „hektikusan” változik. Máskülönben az összes előállítása a „sza- bályosan” következőket szolgáltatná a feladathoz.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok26/50 Az i. … előállítása Egy naiv megoldás: Módosítsuk az összes …-t előállító algoritmust úgy, hogy az i.-hez érve álljon le; s adja vissza az utolsót (tárolni nem is muszáj) Probléma: hatékonyság – minduntalan 1.-től újrakezdi

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok27/50 Az i. … – Permutáció Ismétlés nélküli permutációk – A cél: az i. permutáció előállítása

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok28/50 Az i. … – Permutáció Hogyan sorszámozzunk? Elvárás a permutációindexszel szemben: (PI1)PermIndex: Perm  [1..N!], aholPerm  [1..N] N,  p  Perm: HalmazFelsorolás(p) (PI2)PermIndex bijekció Kiszámítási ötlet: a permutációhoz rendeljünk olyan értéket, amely kifejezi a „távolságát” a rendezettől… pl. egy rendezés során az egyes elemeinek a helyre ugrásakor „megtett távolságokkal” fejezzük ki. Egyértelműség: P  Q  Perm  különbözőek a cserékben szereplő indexpárok

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok29/50 Az i. … – Permutáció Sorszámozáshoz: a rendezés i. lépésekor végrehajtott csere-beli „távolság”  a sorszám i. „tagja” mivel a rendezés során egyre kisebbek (-: vagy nagyobbak :-) az ugrások (N–1,…,1,0), és hézagmentesen kell az 1..N! intervallumot kitölteni ezért faktoriális alapú számrendszert kell alkalmazni: (Fakt2Dec1)Fakt2Dec(s N...s 2 s 1 ):=1+ (Fakt2Dec2)s i  [0..i–1]  i  [1...N].

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok30/50 Az i. … – Permutáció PermutációIndex függvény: A minimum kiválasztásos rendezésből indulunk ki. A keresett index mellett (okulásul) előállítjuk a faktoriális alapú számrendszerbeli alakját is (ez persze „élvezhető” eredményt N<10-re ad). Változó [globális] permInd_Fakt:Szöveg Ez a változó fogja tartalmazni az éppen generált permutáció indexé- nek faktoriális számrendszerbeli alakját. Nem tüntettük föl a paramé- terlistában, hanem „orvul”, globá- lisan elérhető adatként deklaráltuk. Függvény PermIndex_MKR(Változó P:TPerm; Konstans N:Egész):Egész Változó i,j,mini:Egész pI:Egész A minimum kiválasztásos rendezés (MKR) végrehajtása közben képez- zük a P permutáció pI indexét. „Balkézről” megadjuk a faktoriális számrendszerbeli alakját is.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok31/50 Az i. … – Permutáció PermutációIndex függvény (folytatás) : permInd_Fakt:='' pI:=0 Ciklus i=1-től N-1-ig mini:=i Ciklus j=i+1-től N-ig Ha P(j)<P(mini) akkor mini:=j Ciklus vége Csere(P(i),P(mini)) pI:=pI*(N-i+1)+(mini-i) permInd_Fakt:=permInd_Fakt+ Karakter(mini-i+48) Ciklus vége A minimum kiválasztásos rendezés szokásos algoritmusa a permutáció- indexet előállító betétekkel megspé- kelve. Figyeljük meg, miként veszi figyelem- be az adott helyi értéknél alkalmazan- dó számrendszer-alapot! (Horner- elrendezés) permInd_Fakt:=permInd_Fakt+'1' PermIndex_MKR:=pI+1 Függvény vége. A végső értékadás gondoskodik arról, hogy a permutációindex 1-gyel, nem 0-val kezdődjék; és a faktoriális szám- rendszer definíciójának (és a céljaink- nak) megfelelően 1-re végződjék.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok32/50 Az i. … – Permutáció PermutációIndex függvény (folytatás) : Egy példafutás N=4-re: Vegye észre: bijektivitást és a nem rendezéstartóságot!

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok33/50 Az i. … – Permutáció Az i. permutáció függvény: Az előbb alkalmazott számjegysorozattá alakítást kell most csupán „visszafelé” végrehajtanunk. Függvény Index2Perm(Konstans pI:Egész):TPerm Változó i,j,k,t:Egész x:TPerm x:=P1; i:=pI-1 [sorszám-korrekció: 1  0] 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)) k:+1 Ciklus vége Index2Perm:=x Függvény vége.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok34/50 Az i. … – Variáció Ismétléses variáció – A cél: az i. ismétléses variáció előállítása

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok35/50 Az i. … – Variáció Sorszámozás: egyszerű, hiszen tekinthetjük a sorozatokat egy N- alapú számrendszerben felírt K-jegyű számnak: a v K.. v 2 v 1 =11..1 N -től a w K..w 2 w 1 =NN..N N -ig. (IVI1)IsmVarIndex: N *  N  N  [1..N K ]; (IVI2)IsmVarIndex bijekció az N-elemű K-hosszúságú sorozatok halmaza és a [1..N K ] között; (IVI3)IsmVarIndex((V N,V N-1,…,V 2,V 1 ),N,K):= –v, ahol v:= –1=(N K –1)/(N–1)–1

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok36/50 Az i. … – Variáció Az i. variáció függvény: Az előbbi inverzét kell megvalósítanunk. Konstans MaxN:Egész(?) Típus TIsmVar=Tömb(1..MaxN:Egész) Függvény Index2IsmVar(Konstans i,N,K:Egész):TIsmVar Változó ii,j:Egész x:TIsmVar ii:=i-1 [korrekció az 1-gyel kezdődő sorszámozás miatt] Ciklus j=K-tól 1-ig -1-esével x(j):=(ii Mod N)+1; ii:=ii Div N Ciklus vége Index2IsmVar:=x Függvény vége.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok37/50 Véletlen algoritmusok … olyan algoritmusok, amelyben fő szerepet kap a véletlenszám-generátor, és valamilyen tulajdonságú halmaz/sorozat generálása a cél

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok38/50 Véletlen algoritmusok Jelölések, megállapodások: ’ X – sorozat; X’ – az X sorozat algoritmus végrehajtás utáni értéke P(X’ k =X j ) – annak a valószínűsége, hogy az X’ k X j lesz i,j  N,  [0,1]  R VéletlenSzám(i..j) – (egyenletes) véletlen egész szám  [i,j] VéletlenSzám – (egyenletes) véletlen valós szám  [0,1)  R Egyenletesség: F1.P(VéletlenSzám(i..j)=k)=P(VéletlenSzám(i..j)=m)  k,m  [i..j] F2.P(VéletlenSzám<  )=  függvények

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok39/50 Véletlen … – Permutáció Véletlen (ismétlés nélküli) permutáció – „keverés” A cél: X(1..N) elemek egy véletlen permutációjának előállítása Feltételezés: HalmazFelsorolás(X) teljesülése; Pl. X(i)=i (i=1..N)

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok40/50 Véletlen … – Permutáció Megoldás: Egy meglepő gondolat: Mivel a rendezési algoritmusok egy rendezetlenből rendezettet permutálnak, ezért építsük valamely rendező algoritmusra az „inverz-műveletet” (a keverést) is. P1. algoritmus (minimum kiválasztásos rendezés alapján) : Permutálás („Keverés”)Rendezés Ciklus i=1-től N-1-ig j:=VéletlenSzám(i..N) Csere(X(i),X(j)) Ciklus vége Ciklus i=1-től N-1-ig j:=MinIndex(i..N) Csere(X(i),X(j)) Ciklus vége

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok41/50 Véletlen … – Permutáció Feltétel: X i ≠X j i≠j, vagyis ha HalmazFelsorolás(X)=Igaz. Az algoritmus elemzése: P1-1. Állítás: Az algoritmus a bemeneti sorozat egy permutációját állítja elő. P1-2. Állítás: Az X’ minden elemében az X bármely eleme azonos eséllyel lesz az algoritmus végrehajtása után: P(X’ i =X k )=1/N  i,k  [1..N]. P1-3. Állítás: Az algoritmus azonos eséllyel állítja elő az X 1..N elemek tetszőleges permutációját. Permutálás („Keverés”)Rendezés Ciklus i=1-től N-1-ig j:=VéletlenSzám(i..N) Csere(X(i),X(j)) Ciklus vége Ciklus i=1-től N-1-ig j:=MinIndex(i..N) Csere(X(i),X(j)) Ciklus vége

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok42/50 Véletlen … – Permutáció Gyakorlat: Írjunk programot, amely az előbbi eljárással előállít szá- mos permutációt, s eközben számolja, hogy az éppen generált permutáció hányadszorra jött ki. Azt várjuk, hogy minden permutációra ez kb. azonos érték lesz. N! Probléma: a számláló tömb N! méretű (hatékonyság) N  N Megoldása: a P1-2. állításra hivatkozással elegendő azt számlálni, hogy az egyes elemek gyanánt hányszor fordult elő egy-egy érték, azaz elég egy N  N-es mátrix.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok43/50 Véletlen … – Permutáció Gyakorlat (folytatás) : A megoldás legfelsőbb szintje: Eljárás PermutacióVezérlés: Változó i:Egész PermInic Ciklus i=1-től 2*Fakt(N)-ig VéletlenPermutáció PermÉrtékelés Ciklus vége GyakoriságMegjelenítés('Permutációk') Eljárás vége.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok44/50 Véletlen … – Permutáció Gyakorlat (folytatás) : A VéletlenPermutáció eljárás: Eljárás VéletlenPermutáció: Változó i,j:Egész Ciklus i=1-től N-1-ig j:=Random(N-i+1)+i Csere(p(i),p(j)) Ciklus vége Eljárás vége. Eljárás Csere(Változó x,y:Egész): … Eljárás vége.  A PermÉrtékelés eljárás: Eljárás PermÉrtékelés: Változó i:Egész Ciklus i=1-től N-ig gy(p(i),i):+1 Ciklus vége Eljárás vége. Permutálás („Keverés”) Ciklus i=1-től N-1-ig j:=VéletlenSzám(i..N) Csere(X(i),X(j)) Ciklus vége

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok45/50 Véletlen … – Permutáció Gyakorlat (folytatás): Egy futási eredmény: A generált permutációkban 1. helyen az 1 (X 1 ) 1452-ször, … a 7. helyen ugyanő 1377-szer fordult elő, … a 7 (X 7 ) az 1. helyen ször, … a 7. helyen ugyanő 1440-szer. Ellenőrizhető, hogy mind a sor-, mind az oszlopösszegek (=2*N!), aminek az az oka, hogy 2*N! darab véletlen permutációt generáltunk a programmal.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok46/50 Véletlen … – Kombináció Véletlen (ismétlés nélküli) kombináció – A cél: X(1..N) elemek egy véletlen, K-ad osztályú kombinációjának előállítása Feltételezés: HalmazFelsorolás(X) teljesülése; Pl. X(i)=i (i=1..N)

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok47/50 Véletlen – Kombináció Megoldás: K0. algoritmus: Db:=0 Ciklus i=1-től N-ig Ha VéletlenSzám<K/N akkor Db:+1; Y(Db):=X(i) Ciklus vége össz elemszám eltérhetK-tól Probléma: az algoritmusban K/N eséllyel kerül be egy elem, de az össz elemszám (Db) eltérhet az elvárt K-tól. M(Db)=K, D 2 (Db)=N*K/N*(1-K/N)=K-K 2 /N

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok48/50 Véletlen – Kombináció Megoldás (folytatás) : K1. algoritmus: Db:=0 Ciklus i=1-től N-ig Ha VéletlenSzám<(K-Db)/(N+1-i) akkor Db:+1; Y(Db):=X(i) Ciklus vége Megjegyzés: Az algoritmus kiküszöböli az előbbi hibáját. Azt az elvet alkalmazza, hogy figyeli a még beveendő elemek számát, és garantálja, hogy éppen annyi kerüljön be.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok49/50 Véletlen – Kombináció Megoldás (folytatás) : K2. algoritmus: Ciklus i=1-től K-ig Y(i):=X(i) Ciklus vége Ciklus i=K+1-tól N-ig Ha VéletlenSzám<K/i akkor j:=VéletlenSzám(1..K); Y(j):=X(i) Ciklus vége A K2 algoritmus elemzése: K2-1. Állítás: A K2. algoritmus az X(1..N) elemek egy K-ad osztályú kombinációját eredményezi. K2-2. Állítás: A K2. algoritmus végrehajtása utáni Y-ra igaz, hogy Y bármely eleme helyén X bármely eleme azonos eséllyel (K/N) előfordulhat. K2-3. Állítás: A K2. algoritmus azonos eséllyel állítja elő az {1..N} számok tetszőleges K-ad osztályú kombinációját.

Kombinatorikus algoritmusok 2010Szlávi: Kombinatorikus algoritmusok50/50 Véletlen – Kombináció Gyakorlat: Írjunk programot (vagy folytassuk az előbbit), amely a K2. eljárással előállít számos kombinációt, s eközben számolja, hogy az éppen generált hányadszorra jött ki. Azt várjuk, hogy minden kombinációra ez kb. azonos érték lesz. Egy futási eredmény (N=7, K=4):