1. ábra. Számláló rendezés

Hasonló dokumentumok
Edényrendezés. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n).

Számjegyes vagy radix rendezés

Számláló rendezés. Példa

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

Kupac adatszerkezet. 1. ábra.

Elmaradó óra. Az F = (V,T) gráf minimális feszitőfája G-nek, ha. F feszitőfája G-nek, és. C(T) minimális

A MAXIMUM-KUPACOL eljárás helyreállítja az A[i] elemre a kupactulajdonságot. Az elemet süllyeszti cserékkel mindaddig, amíg a tulajdonság sérül.

1. ábra. Egy rekurzív preorder bejárás. Egy másik rekurzív preorder bejárás

Kupac adatszerkezet. A[i] bal fia A[2i] A[i] jobb fia A[2i + 1]

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

14. Mediánok és rendezett minták

Specifikáció. B logikai formula, a bemeneti feltétel, K logikai formula, a kimeneti feltétel, A az algoritmus, amelyre az állítás vonatkozik.

Rendezések. Összehasonlító rendezések

Ö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.

15. tétel. Adatszerkezetek és algoritmusok vizsga Frissült: január 30.

7. előadás. Gyorsrendezés, rendezés lineáris lépésszámmal. Adatszerkezetek és algoritmusok előadás március 6.

A félév során előkerülő témakörök

Haladó rendezések. PPT 2007/2008 tavasz.

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

Az absztrakt adattípus egy (E,M) párral adható meg, ahol E az értékhalmaz, M a műveletek halmaza. Fő tulajdonságok. Verem

1. Alapfogalmak Algoritmus Számítási probléma Specifikáció Algoritmusok futási ideje

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

Algoritmusok és adatszerkezetek gyakorlat 09 Rendezések

19. AZ ÖSSZEHASONLÍTÁSOS RENDEZÉSEK MŰVELETIGÉNYÉNEK ALSÓ KORLÁTJAI

Programozási segédlet

Algoritmusok és adatszerkezetek gyakorlat 07

2. Milyen értéket határoz meg az alábbi algoritmus, ha A egy vektor?. (2 pont)

Programozási módszertan. Mohó algoritmusok

Algoritmusok vektorokkal keresések 1

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

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Kupacrendezés. Az s sorban lévő elemeket rendezzük a k kupac segítségével! k.empty. not s.isempty. e:=s.out k.insert(e) not k.

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.

Előfeltétel: legalább elégséges jegy Diszkrét matematika II. (GEMAK122B) tárgyból

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Az optimális megoldást adó algoritmusok

A számítástudomány alapjai. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem

Gyakorló feladatok ZH-ra

Nagyságrendek. Kiegészítő anyag az Algoritmuselmélet tárgyhoz. Friedl Katalin BME SZIT február 1.

Felvételi tematika INFORMATIKA

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

Adatszerkezetek 7a. Dr. IványiPéter

Adatszerkezetek I. 8. előadás. (Horváth Gyula anyagai felhasználásával)

Adatbázis rendszerek Gy: Algoritmusok C-ben

Algoritmusok bonyolultsága

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

INFORMATIKA javítókulcs 2016

Algoritmusok bonyolultsága

Algoritmuselmélet 2. előadás

Gyakorlatok. P (n) = P (n 1) + 2P (n 2) + P (n 3) ha n 4, (utolsó lépésként l, hl, u, hu-t léphetünk).

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

Példa Hajtsuk végre az 1 pontból a Dijkstra algoritmust az alábbi gráfra. (A mátrixban a c i j érték az (i, j) él hossza, ha nincs él.

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

Programozás II. előadás

Algoritmizálás. Horváth Gyula Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Módosítható Prioritási sor Binomiális kupaccal. Wednesday, March 21, 12

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

Programozási módszertan. Függvények rekurzív megadása "Oszd meg és uralkodj" elv, helyettesítő módszer, rekurziós fa módszer, mester módszer

Algoritmuselmélet 1. előadás

end function Az A vektorban elõforduló legnagyobb és legkisebb értékek indexeinek különbségét.. (1.5 pont) Ha üres a vektor, akkor 0-t..

PROGRAMOZÁSI TÉTELEK

file:///d:/okt/ad/jegyzet/ad1/b+fa.html

Általános algoritmustervezési módszerek

10. előadás Speciális többágú fák

Egyesíthető prioritási sor

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

15. A VERSENYRENDEZÉS

Fibonacci számok. Dinamikus programozással

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

Melykeres(G) for(u in V) {szin(u):=feher Apa(u):=0} for(u in V) {if szin(u)=feher then MBejar(u)}

8. Mohó algoritmusok Egy esemény-kiválasztási probléma. Az esemény-kiválasztási probléma optimális részproblémák szerkezete

Miskolci Egyetem Gépészmérnöki és Informatikai Kar Informatikai Intézet Alkalmazott Informatikai Intézeti Tanszék

Mohó algoritmusok. Példa:

Programozás alapjai 9. előadás. Wagner György Általános Informatikai Tanszék

Minimális feszítőfák Legyen G = (V,E,c), c : E R + egy súlyozott irányítatlan gráf. Terjesszük ki a súlyfüggvényt a T E élhalmazokra:

Adatszerkezetek és algoritmusok

Algoritmusok és adatszerkezetek gyakorlat 03 Oszd meg és uralkodj. Nagy

Algoritmusok helyességének bizonyítása. A Floyd-módszer

Egyszerű programozási tételek

Adatszerkezetek I. 7. előadás. (Horváth Gyula anyagai felhasználásával)

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

Algoritmuselmélet. 2-3 fák. Katona Gyula Y. Számítástudományi és Információelméleti Tanszék Budapesti Műszaki és Gazdaságtudományi Egyetem. 8.

Gráfok, definíciók. Gráfok ábrázolása. Az adott probléma megoldásához ténylegesen mely műveletek szükségesek. Ábrázolások. Példa:

Térinformatikai algoritmusok Elemi algoritmusok

ELEMI PROGRAMOZÁSI TÉTELEK

Online migrációs ütemezési modellek

GRÁFELMÉLET. 7. előadás. Javító utak, javító utak keresése, Edmonds-algoritmus

Dr. Schuster György február / 32

Ellenőrző kérdések. 36. Ha t szintű indexet használunk, mennyi a keresési költség blokkműveletek számában mérve? (1 pont) log 2 (B(I (t) )) + t

Programozás alapjai. 5. előadás

7 7, ,22 13,22 13, ,28

Adatszerkezet - műveletek

INFORMATIKAI ALAPISMERETEK

Algoritmusokfelülnézetből. 1. ELŐADÁS Sapientia-EMTE

Ugrólisták. RSL Insert Example. insert(22) with 3 flips. Runtime?

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

Partíció probléma rekurzíómemorizálással

Geometriai algoritmusok

Rekurzív algoritmusok

1. előadás. számításokban. Adatszerkezetek és algoritmusok előadás február 12. Kósa Márk, Pánovics János, Szathmáry László és Halász Gábor

Átírás:

1:2 <= > 2:3 1:3 <= > <= > 1,2,3 1:3 <= > 1,3,2 3,1,2 2,1,3 2:3 <= > 2,3,1 3,2,1 1. ábra. Alsó korlát rendezési algoritmusokra Minden olyan rendezési algoritmusnak a futását, amely elempárok egymással való összehasonlítása alapján működik leírja egy bináris döntési fa. Az algoritmus által a legrosszabb esetben szükséges összahasonlítások számát a neki megfelelő döntési fa magassága adja meg. Tétel Egy n darab elemet rendező döntési fa magassága Ω(nlogn). Bizonyítás A fa leveleinek száma a lehetséges sorrendek száma, azaz n!. Ha a fa magassága h, akkor 2 h 1 n! kell teljesüljön, következésképpen h 1 lg(n!) lg((n/e) n ) = nlgn nlge = Ω(nlgn). Következmény Minden olyan rendezési algoritmusra, amely csak az elempárok összehasonlítása alapján működik T lr (n) = Ω(nlgn). Számláló rendezés Amennyiben a rendezendő elemek által felvehető értékek halmazának számossága kicsi, akkor megadható lineáris időigényű algoritmus. A bemenet a rendezendő elemek egy n méretű A tömbben eltárolva, a kimenet ezen számok egy B tömbben rendezetten. Továbbá feltesszük, hogy a rendezendő elemek mindegyike az {1,...,k} halmazba esik. C[i] tartalmazza azt az információt, hogy a legfeljebb i nagyságú elemből hány darab van. Szamlalorend(A,B,k) for i=1 to k C[i]:=0 for j=1 to n C[A[j]]:=C[A[j]]+1 1

for i=2 to k C[i]:=C[i]+C[i-1] for j=n downto 1 {B[C[A[j]]]:=A[j] C[A[j]]:=C[A[j]]-1} Megjegyzés: Az algoritmus ötlete nem csak akkor használható, ha az elemek az {1,...,k} halmazba esnek. Általánosabb esetben meg kell keresni a minimális elemet min-t, és C[i] a legfeljebb i min + 1 nagyságú elemeket tartalmazza. Definíció Egy rendezést stabilnak nevezünk, ha az azonos értékű elemek ugyanabban a sorrendben jelennek meg a kimeneti tömbben, mint ahogy a bemeneti tömbben szerepeltek. A leszámláló rendezés stabil. Futási idő: Θ(n + k) A=[3,1,3,1,2,1,1,2,3] C=[4,2,3] C=[4,6,9] B=[0,0,0,0,0,0,0,0,3] C=[4,6,8] B=[0,0,0,0,0,2,0,0,3] C=[4,5,8] B=[0,0,0,1,0,2,0,0,3] C=[3,5,8] Számjegyes vagy radix rendezés 329 720 720 329 457 436 329 436 657 457 436 457 839 657 839 657 436 329 457 720 720 839 657 839 Bemenet: H k dimenziós vektorok halmaza, ahol az i-edik komponens minden i-re egy olyan elemtípusból kerül ki, amelyen adott egy rendezési reláció. Kimenet: H elemei a lexikografikus rendezés alapján rendezve. Definíció Egy X = (x 1,...,x k ) vektor megelőzi az Y = (y i,...,y k ) vektort a lexikografikus rendezésben, ha i, amelyre teljesül, hogy j < i x j = y j és x i < y i. Elvi algoritmus for i:=d downto 1 H Stabil rendezése a kulcs i-edik jegye szerint Helyesség: A ciklusmag végrehajtása után a H halmaz rendezett lesz arra a kulcsra nézve, amely az eredeti kulcs [i..d] jegyeit (karaktereit) tartalmazza. Bizonyítás i-szinti indukcióval. Futási idő Ha a jegyek szerinti rendezés lineáris idejű (pl számláló), akkor a futási idő O(dn). 2

Edényrendezés Tegyük fel, hogy a rendezendő H = {a 1,...,a n } halmaz elemei a [0,1) intervallumba eső valós számok. Vegyünk m db vödröt, V [0],...,V [m 1] és osszuk szét a rendezendő halmaz elemeit a vödrökbe úgy, hogy az a i elem az m a i sorszámú vödörbe kerüljön. Majd rendezzük az egy vödörbe került elemeket, és a vödrök sorszáma szerinti növekvő sorrendben fűzzük össze a rendezett részsorozatokat (vödröket). Edényrendezés For i=1 to n Beszúrjuk a i -t a B[ na i ] listába For i=0 to m-1 Rendezzük a B[i] listát beszúró rendezéssel Összefűzzük a B[0],B[1],...,B[m 1] listákat. Helyesség: Ha két elem ugyanabba a vödörbe kerül, akkor a beszúró rendezés miatt lesz megfelelő a sorrendjük, egyébként pedig a vödrök összefűzésének sorrendje miatt. Legyen A = {0.12, 0.21, 0.68, 0.26, 0.72, 0.94, 0.78, 0.17, 0.23, 0.39}, és legyen m = 10. Ekkor a vödrök tartalma B[1] = {0.12,0.17}, B[2] = {0.21,0.26,0.23}, B[3] = {0.39}, B[6] = {0.68}, B[7] = {0.72, 0.78}, B[9] = {0.94}. Futási idő: Tegyük fel, hogy m = n, ekkor: legjobb eset Θ(n), legrosszabb eset Θ(n 2 ), átlagos eset Θ(n). Kiválasztási probléma Bemenet: Azonos típusú (különböző) elemek H = {a 1,...,a n } halmaza, amelyeken értelmezve van egy lineáris rendezési reláció és egy i (1 i n) index. Kimenet: Olyan x H, hogy {y : y H y x} = i. A kimenetben szereplő x-et a H rendezett minta i-edik (legkisebb) elemének nevezzük. A középső elemet a rendezett minta mediánjának hívjuk. Pontosabban, az i = (n + 1)/2 -edik elem az alsó, az i = (n + 1)/2 -edik elem a felső medián. Feloszt eljárás (Hoare féle) Feloszt(A,p,r) x:=a[p] i:=p-1 j:=r+1 while(igaz) {repeat j:=j-1 until A[j]<=x repeat i:=i+1 until A[i]>=x if i<j then csere(a[i],a[j]) else return j} 3

: i[5,3,2,6,1,4,3,7] j x=5 [5 i,3,2,6,1,4,3 j,7] [3 i,3,2,6,1,4,5 j,7] [3,3,2,6 i,1,4 j,5,7] [3,3,2,4 i,1,6 j,5,7] [3,3,2,4,1 j,6 i,5,7] Return 5 Kiválasztás ismételt felosztással Az algoritmus használja a gyorsrendezésnél definiált Feloszt(A,p,r) eljárást, amely átrendezi az A tömb A[p] és A[r] közé eső szakaszát úgy, hogy a visszaadott q értékre A[p,...,q] minden eleme kisebb vagy egyenlő A[q+1,...,r] minden eleménél. Az alábbi algoritmus a Hoare felosztást használja, ahol nem garantált, hogy A[p,...,q 1] minden eleme kisebb vagy egyenlő, mint A[q]. Elvi algoritmus Kiválaszt(A,p,r,i) If p=r Then return A[p] q:=feloszt(a,p,r) k:=q-p+1 if i k Return Kiválaszt(A,p,q,i) else Return Kiválaszt(A,q+1,r,i-k) 1. : A=[6,4,3,7,5,1,8,9], i=2 A feloszt eljárás után A = [1,4,3,5,7,6,8,9] és q = 4 A rekurzív hívás az A,1,4,2 értékekre történik azaz a [1, 4, 3, 5] résztömbben keressük a második legkisebb elemet. 2. : A=[6,4,3,7,5,1,8,9], i=6 A feloszt eljárás után A = [1,4,3,5,7,6,8,9] és q = 4 A rekurzív hívás az A,5,8,2 értékekre történik azaz a [7,6,8,9] tömb minimális elemét keressük. Megjegyzés Ha olyan felosztást használunk, ahol a felosztó elemtől balra eső elemek a felosztó elemnél mind kisebbek vagy egyenlők (pl Lomuto) akkor a baloldali rekurzív hívás az A[p,q 1] tömbre vonatkozik, és q = i esetén a felosztó elem az i-edik legkisebb így az eljárást nem kell folytatnunk. Futási idő elemzés Legjobb eset: O(n) Legrosszabb eset: O(n 2 ) Átlagos eset: O(n) Bizonyítás: Feltesszük, hogy minden bemenet egyformán valószínű. Legyen T a (n) az n méretű input átlagos költsége. Az q felosztó index lehetséges értékei: q = 1,2,...,n. A keresés vagy a bal oldali részben folytatódik, amelynek hossza ekkor q, vagy a jobboldaliban, amelynek hossza n q. Feltéve, hogy T a (n) monoton növekvő függvény, használva, hogy a felosztás lineáris idejű kapjuk, hogy T a (n) 1 n 1 n 1 q=1 max{t a (q),t a (n q)} + O(n). 4

Az állítást indukcióval igazoljuk, ehhez tegyük fel, hogy van olyan c, amelyre T a (k) c k teljesül k < n esetén. Továbbá legyen α a feloszt eljárás futási idejében szereplő multiplikatív konstans. Ekkor azt kapjuk Végrehajtva az összegzéseket adódik, hogy T a (n) 2 n 1 n 1 c q + αn q= n/2 T a (n) 3cn/4 + c/2 + an = cn (cn/4 c/2 an). Megfelelően nagy c-t választva a fenti kifejezés jobboldala kisebb lesz, mint cn. Kiválasztás lineáris időben Linkiválaszt algoritmus 1. Osszuk a bemeneti tömb n elemét n/5 5 elemű csoportra, a maradék elemekből alkossunk egy további csoportot. 2. Minden csoportnak keressük meg a mediánját úgy, hogy az 5 elemű csoportokat (és az esetleges egyetlen kisebb elemszámú csoportot) rendezzük. 3. A Linkiválaszt algoritmus rekurzív hívásával határozzuk meg a kapott mediánokból álló halmaz mediánját. 4. A Feloszt eljárás alapján osszuk fel az így kiválasztott elem körül a bemeneti tömböt, legyen k az elemnél nem nagyobb tőle különböző elemek száma, n k 1 az elemnél nagyobb elemek száma. 5. A Linkiválaszt algoritmus rekurzív hívásával határozzuk meg a baloldali részben az i-edik elemet, ha i k, illetve a jobboldali részben az i k 1-edik elemet, ha i > k +1. Az i = k +1 esetben a felosztó elem a keresett elem. Elemzés Fe 2. ábra. Az ábrán a sötét elemek kisebbek a felosztó elemnél, a világosak nagyobbak, így a rekurzív hívás során legfeljebb 7n/10 + 6 elemre kell végrehajtani az algoritmust. Tehát elegendően nagy n esetén a legrosszabb eset korlátra fennáll a következő rekurzív összefüggés: T lr (n) T lr ( n/5 ) + T lr (7n/10 + 6) + O(n). 5

Teljes indukcióval igazolható, hogy T lr (n) = O(n). Megvalósítás: Az 5-ös csoportokat úgy választjuk ki, hogy a tömb első, második, harmadik, negyedik és ötödik ötödéből is veszünk egy-egy elemet, így az ötösöket tudjuk úgy rendezni, hogy a mediánok a tömb közepső részére kerüljenek. Ezáltal a Linkiválaszt algoritmus helyben megvalósítható csak a kiindulási tömb felhasználásával. Megjegyzés: A lineáris idejű mediánválasztással egyszerűen módosítható a gyorsrendezés algoritmusa úgy, hogy legrosszabb esetben is O(n log n) legyen a futási ideje. Annyit kell csak tenni, hogy a felosztó elemnek mindig a mediánt választjuk. Kiválasztás kupaccal A bináris kupac egy majdnem teljes bináris fa, amely minden szintjén teljesen kitöltött kivéve a legalacsonyabb szintet, ahol balról jobbra haladva egy adott csúcsig vannak elemek. A fát egy tömbben reprezentáljuk, minden elem a szint szerinti bejárás szerinti sorszámának megfelelő eleme a tömbnek. A kupacot reprezentáló A tömbhöz két értéket rendelünk, hossz(a) a tömb mérete, kupacmeret(a) a kupac elemeinek a száma. A kupac gyökere A[1], a szerkezeti kapcsolatok egyszerűen számolhatóak: A[i] bal fia A[2i] A[i] jobb fia A[2i + 1] A[i] apja A[ i/2 ] A kupac minden gyökértől különböző elemére teljesül, hogy az értéke nem lehet nagyobb, mint az apjáé. Ennek következménye, hogy a kupac minden részfájára teljesül, hogy a gyökéreleme maximális. MAXIMUM-KUPACOL Eljárás A MAXIMUM-KUPACOL eljárás helyreállítja az A[i] elemre a kupactulajdonságot. Az elemet süllyeszti cserékkel mindaddig, amíg a tulajdonság sérül. MAXIMUM-KUPACOL(A,i) l:=2i //az A[i] elem bal fiának indexe r:=2i+1 //az A[i] elem jobb fiának indexe if l<=kupacmeret(a) and A[l]>A[i] then max:=l else max:=i if r<=kupacmeret(a) and A[r]>A[max] then max:=r // A[max] a három elem közül a legnagyobb if max!=i then {Csere(A[i],A[max]) MAXIMUM-KUPACOL(A,max)} A=[5,14,13,8,3,4,6,2] MAXIMUM-KUPACOL(A,1) A=[14,5,13,8,3,4,6,2] A=[14,8,13,5,3,4,6,2] 6

5 14 13 8 3 4 6 14 5 13 2 8 3 4 6 2 14 8 13 5 3 4 6 2 3. ábra. Kiválasztás kupaccal Az algoritmus során a for ciklus j értékkel való végrehajtása után a kupac az első j elemből az i legkisebbet tartalmazza. Kupacvalaszt(A,i) Kupacmeret(A):=i for j= [i/2] to 1 MAXIMUM KUPACOL(A,j) // az elso i elembol egy kupac for j=i+1 to n {if A[1]>A[j] then {Csere(A[1],A[j]) MAXIMUM KUPACOL(A,1)}} return A[1] Futási idő: O(i) + (n i)o(logi) A=[2,5,7,3,6,4,8], k=3 A=[2,5,7 3,6,4,8] A=[7,5,2 3,6,4,8] A=[3,5,2 7,6,4,8] A=[5,3,2 7,6,4,8] A=[4,3,2 7,6,5,8] Minimum és maximum egyidejű választása A feladat adott n méretű tömb elemeiből kiválasztani a maximális és minimális elemet. MaxMin(A) if (n%2=0) then {k:=2 if (A[1]<A[2]) then 7

{mini:=1 maxi:=2} else {mini:=2 maxi:=1}} else {k:=1 mini:=1 maxi:=1} while(k<n) {if A[k+1]<A[k+2] then {if A[k+1]<A[mini] then mini:=k+1 if A[k+2]>A[maxi] then maxi:=k+2} else {if A[k+2]<A[mini] then mini:=k+2 if A[k+1]>A[maxi] then maxi:=k+1} k:=k+2} Futási idő Az algoritmus legfeljebb 3n/2 összehasonlítást végez. Kiskérdések számláló rendezés Linkiválaszt algoritmus Kiválasztás kupaccal Szorgalmi feladat Adjunk meg egy eljárást, amely kiválasztja a legkisebb és a második legkisebb elemet n elemből n 1 + logn elempár összehasonlításával. Beküldés: cimreh@inf.u-szeged.hu, Leírás +magyarázat + futási idő elemzés első négy megoldó 8-8 pont a második négy megoldó 5-5 pont A szerzett plusszpontok a vizsga minimumkövetelményébe nem számítanak bele. 8