Leszámláló rendezés. 1. Végigmegyünk az A-n, és ha egy elem értéke i, akkor megnöveljük C[i] értékét eggyel.

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

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

Algoritmuselmélet 2. előadás

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

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

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

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

A 2014/2015. tanévi Országos Középiskolai Tanulmányi Verseny első forduló MATEMATIKA I. KATEGÓRIA (SZAKKÖZÉPISKOLA) Javítási-értékelési útmutató

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

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

Adatbázis rendszerek Gy: Algoritmusok C-ben

Diszkrét matematika 2. estis képzés

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

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

Egészrészes feladatok

I. Egyenlet fogalma, algebrai megoldása

1.1. Alapfeladatok. hogy F 1 = 1, F 2 = 1 és általában F n+2 = F n+1 + F n (mert a jobboldali ág egy szinttel lennebb van, mint a baloldali).

Felvételi tematika INFORMATIKA

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

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:

Diszkrét matematika 2.C szakirány

Algoritmuselmélet 12. előadás

Informatikai tehetséggondozás:

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

Diszkrét matematika 1. estis képzés

FPI matek szakkör 8. évf. 4. szakkör órai feladatok megoldásokkal. 4. szakkör, október. 20. Az órai feladatok megoldása

Arany Dániel Matematikai Tanulóverseny 2014/2015-ös tanév első (iskolai) forduló Haladók II. kategória

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

Az R halmazt a valós számok halmazának nevezzük, ha teljesíti az alábbi 3 axiómacsoport axiómáit.

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

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.

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

Arany Dániel Matematikai Tanulóverseny 2008/2009-es tanév első (iskolai) forduló haladók II. kategória

Diszkrét matematika I.

Hadamard-mátrixok Előadó: Hajnal Péter február 23.

1. előadás. Lineáris algebra numerikus módszerei. Hibaszámítás Számábrázolás Kerekítés, levágás Klasszikus hibaanalízis Abszolút hiba Relatív hiba

2018, Diszkrét matematika

BBTE Matek-Infó verseny mintatételsor Informatika írásbeli vizsga

Gyakorló feladatok ZH-ra

OSZTHATÓSÁG. Osztók és többszörösök : a 3 többszörösei : a 4 többszörösei Ahol mindkét jel megtalálható a 12 többszöröseit találjuk.

INFORMATIKA javítókulcs 2016

Algoritmuselmélet. Legrövidebb utak, Bellmann-Ford, Dijkstra. Katona Gyula Y.

Magasabbfokú egyenletek

Rekurzív algoritmusok

26. MINIMÁLIS KÖLTSÉGŰ UTAK MINDEN CSÚCSPÁRRA

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

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

Elemi algebrai eszközökkel megoldható versenyfeladatok Ábrahám Gábor, Szeged

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

Trigonometria Megoldások. 1) Igazolja, hogy ha egy háromszög szögeire érvényes az alábbi összefüggés: sin : sin = cos + : cos +, ( ) ( )

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

Összetett programozási tételek

15. A VERSENYRENDEZÉS

352 Nevezetes egyenlôtlenségek. , az átfogó hossza 81 cm

Matematika. 1. osztály. 2. osztály

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

10. Szimultán kiválasztások

Legkönnyebb és legnehezebb Rendezési algoritmusok

KOVÁCS BÉLA, MATEMATIKA I.

Programozás II. előadás

Oktatási Hivatal. 1 pont. A feltételek alapján felírhatók az. összevonás után az. 1 pont

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 2015/2016. tanévi Országos Középiskolai Tanulmányi Verseny döntő forduló MATEMATIKA III. KATEGÓRIA (a speciális tanterv szerint haladó gimnazisták)

Webprogramozás szakkör

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

Országos Középiskolai Tanulmányi Verseny 2009/2010 Matematika I. kategória (SZAKKÖZÉPISKOLA) 2. forduló feladatainak megoldása

3. Előadás. Megyesi László: Lineáris algebra, oldal. 3. előadás Lineáris egyenletrendszerek

Számításelmélet. Második előadás

Programozás alapjai. 6. gyakorlat Futásidő, rekurzió, feladatmegoldás

2014. évi Bolyai János Megyei Matematikaverseny MEGOLDÁSI ÉS ÉRTÉKELÉSI ÚTMUTATÓ 11. évfolyam

A szimplex algoritmus

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉP SZINT Függvények

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

8. Egyenletek, egyenlőtlenségek, egyenletrendszerek II.

Arany Dániel Matematikai Tanulóverseny 2015/2016-os tanév 1. forduló Haladók III. kategória

A tanévi matematika OKTV I. kategória első (iskolai) fordulójának pontozási útmutatója

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

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

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.

Lekérdezések feldolgozása és optimalizálása

Szittyai István december 8. SZTE Bolyai Intézet. Szittyai István (NLG, Hmvh) Partíciók , Bolyai, Szeged 1 / 24

A fejlesztés várt eredményei a 1. évfolyam végén

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI EMELT SZINT Trigonometria

Általános algoritmustervezési módszerek

1. A polinom fogalma. Számolás formális kifejezésekkel. Feladat Oldjuk meg az x2 + x + 1 x + 1. = x egyenletet.

Tartalom. Programozási alapismeretek. 11. előadás

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

MATEMATIKA JAVÍTÁSI-ÉRTÉKELÉSI ÚTMUTATÓ

XXIV. NEMZETKÖZI MAGYAR MATEMATIKAVERSENY Szabadka, április 8-12.

MATEMATIKA ÉRETTSÉGI TÍPUSFELADATOK MEGOLDÁSAI KÖZÉPSZINT Függvények

11. Sorozatok. I. Nulladik ZH-ban láttuk:

30. ERŐSEN ÜSSZEFÜGGŐ KOMPONENSEK

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

2018, Funkcionális programozás

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

Permutációk véges halmazon (el adásvázlat, február 12.)

5. előadás. Programozás-elmélet. Programozás-elmélet 5. előadás

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.

17. A 2-3 fák és B-fák. 2-3 fák

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

Átírás:

13. előadás

Leszámláló rendezés Tegyük fel, hogy van n db bemeneti elem, s ezek mindegyike 1 és k közötti egész szám. Az alapötlet: meghatározzuk minden egyes x bemeneti elemre azoknak az elemeknek a számát, amelyek kisebbek, mint az x. Ezután x-et közvetlenül a saját pozíciójára tudom helyezni. Legyen a bemenet az A[1..n] tömb, a kimenet a B[1..n] tömb. Mindkettő hossza: hossz[a]=hossz[b]=n Szükség van még egy C[1..k] tömbre átmeneti munkaterületként.

Leszámláló rendezés 1. Végigmegyünk az A-n, és ha egy elem értéke i, akkor megnöveljük C[i] értékét eggyel. 2. Minden i-re 1..k között meghatározzuk, hogy hány olyan bemeneti elem van, amelyiknek az értéke i (összegzés C-n) 3. Minden j-re n..1 között A[j]-t betesszük B megfelelő pozíciójába - ezt a C-ből állapítjuk meg. Ha betettük, akkor a C[A[j]] értékét csökkentjük, így a következő vele egyenlő elem már elé kerül, vagyis így stabil lesz a rendezés, az egyenlő elemeknél megtartja az eredeti sorrendet.

Leszámláló rendezés 3 6 1 3 1 A tömb 2 0 2 3 0 1 C tömb C-ben az i-vel = elemek száma 1. Végigmegyünk az A-n, és ha egy elem értéke i, akkor megnöveljük C[i] értékét eggyel.

Leszámláló rendezés 3 6 1 3 1 A tömb 2 2 7 7 8 C tömb C-ben az i-nél elemek száma 2. Minden i-re 1...k között meghatározzuk, hogy hány olyan bemeneti elem van, amelyiknek az értéke i (összegzés C-n)

Leszámláló rendezés 3 6 1 3 1 A tömb 2 2 7 7 8 C tömb B tömb 3. Minden j-re n...1 között A[j]-t betesszük B megfelelő pozíciójába - ezt a C-ből állapítjuk meg.

Leszámláló rendezés 3 6 1 3 1 A tömb 2 2 6 7 8 C tömb 1 B tömb

Leszámláló rendezés 3 6 1 3 1 A tömb 1 2 6 7 8 C tömb 1 B tömb

Leszámláló rendezés 3 6 1 3 1 A tömb 1 2 5 7 8 C tömb 1 3 B tömb

Leszámláló rendezés 3 6 1 3 1 A tömb a végén: 1 1 3 3 6 B tömb

Leszámláló rendezés Az algoritmus pszeudokódja: for i 1 to k do C[i] 0 for j 1 to hossz(a) do C[A[j]] C[A[j]] + 1 for i 2 to k do C[i] C [i] + C[i-1] for j hossz(a) downto 1 do B[C[A[j]]] A[j] C[A[j]] C[A[j]] - 1 C-ben az i-vel = elemek száma C-ben az i-nél elemek száma

Leszámláló rendezés Futási idő: 1. for ciklus: (k) 2. for ciklus: (n) 3. for ciklus: (k). for ciklus: (n) Így a teljes időigény: (k+n). Ha k = (n), akkor a rendezés futási ideje (n)! Ez ui. nem összehasonlító rendezés. A helyigénye viszont nagyobb

Batcher-féle rendezés Batcher-féle páros-páratlan összefésüléses rendezés Jelentősége: ez a MergeSort olyan változata, amelyben a lépések jelentős része párhuzamosan végezhető el. Ha párhuzamos processzorokon hajtanánk végre, akkor azt tapasztalnánk, hogy ((log 2 n) 2 ) idő alatt futna le, szemben a MergeSort (n * log 2 n) idejével.

Összefuttatásos rendezés MergeSort(S) S hossza 1? Szétvág(S, S1,S2) SKIP MergeSort(S1) MergeSort(S2) Összefuttat(S1, S2, S)

Összefuttatásos rendezés tömbre külső hívás: MergeSort(A,1,n) MergeSort(A, k, v) k v? h (k+v)/2 SKIP MergeSort(A, k, h) MergeSort(A, h+1, v) Összefuttat(A[k..h], A[h+1..v], A[k..v]) kell egy segédtömb is itt

Mergesort Hatékonyságelemzés: Műveletigény: ha n a két sorozat együttes hossza: MÖ összefuttat (n)= n-1 MÖMS(n) (n-1)* log 2 n = (n log 2 n)

Mergesort 3 5 9 21 23 2 A[1..k] 11 16 29 B[1..m] C[1..k+m] 3 5 9 11 16 21 23 29 2

Mergesort A= a 1 < a 2 < < a k B = b 1 < b 2 < < b m C = c 1 < c 2 < < c m+k

Batcher-féle Ez lesz a PP_Merge. Egy tömb(részlet) két rendezett feléből összefésüléssel előállítja a tömb(részlet) rendezett tartalmát. Ez is rekurzív eljárás, csak kicsit másképp.

Batcher-féle rendezés az új összefésülés: 1. A páratlan és B páros elemeit fésüli össze U-ba 2. A páros és B páratlan elemeit fésüli össze V-be A= a 1 < a 3 < a 5 <. B = b 2 < b < b 6 <. U = u 1 < u 2 < u 3 < A= a 2 < a < a 6 <. B = b 1 < b 3 < b 5 <. V = v 1 < v 2 < v 3 <. Tegyük fel, hogy k = m vagy k = m+1

Batcher-féle rendezés 3. Az U és V sorozatokat nem kell összefésülni, hanem elég csak az egymás alatti u i,v i párokat 1-1 összehasonlítással a helyes sorrendbe rakni, és így {u 1,v 1 }, {u 2,v 2 }, { u 3,v 3 },..-ból kialakul a helyes sorrend. (Ez be fogjuk látni.) Párhuzamosítás: 1. és 2. párhuzamosan végezhető.

Batcher-féle rendezés példa A: 1 5 7 11 12 1 20 B: 2 3 6 10 13 15 16 17 1.csapat - A páratlan, B páros: A: 1 5 11 1 B: 3 10 15 17 U: 1 3 5 10 11 1 15 17

Batcher-féle rendezés A: 1 5 7 11 12 1 20 B: 2 3 6 10 13 15 16 17 2. csapat - A páros, B páratlan: A: 7 12 20 B: 2 6 13 16 V: 2 6 7 12 13 16 20

Batcher-féle rendezés {u 1,v 1 }, {u 2,v 2 }, { u 3,v 3 } párosítás: 1 3 5 10 11 1 15 17 2 6 7 12 13 16 20 1 2 3 5 6 7 1 0 1 1 1 2 1 3 1 1 5 1 6 1 7 2 0

Batcher-féle rendezés Rekurzió: A 2-2 rövidebb sorozat összefésülését ugyanezzel az eljárással végezzük. Ez rekurzív hívással valósul meg. Ehhez meg kell adni a legkisebb k és m értéket, amelyre már nem hívja az eljárás önmagát: Egy 2 hosszú tömböt még szétvágunk két 1 hosszú részre és azokra meghívjuk az összefésülőt, ekkor k=1 és m=1. Egy 1 hosszú tömböt azonban már nem fésülünk össze, hanem felismerjük, hogy az már rendezett, így nulla (0) összehasonlítást igényel, ekkor k=1, m=0.

Batcher-féle rendezés Állítás: A PP_Merge eljárás helyes. Belátjuk, hogy a leírt eljárás azt a helyes rendezett sorozatot eredményezi, amelyet C = c 1 < c 2 < < c m+k -val jelöltünk Esetszétválasztással gondoljuk meg: c 1 = min{u 1,v 1 }, c 2 = max{u 1,v 1 } Általában, ha 1 i (k+m)/2 : c 2i-1 = min{u i,v i }, c 2i = max{u i,v i }

Batcher-féle rendezés Vegyük figyelembe a kiegyensúlyozott szétvágást is, azaz azt, hogy k=m vagy k=m+1 esetén (k+m)/2 =m. Ha k+m páratlan, akkor még azt is be kell látni, hogy c k+m is helyesen képződik, hiszen erre akkor a képlet nem vonatkozik. Bizonyítás: I. Belátjuk, hogy a C sorozatban bármely páros indexű tagig elmenve c 1, c 2k között ugyanannyi u i szerepel, mint v j vagyis az U és a V sorozat szinte cipzár - szerűen építi a C-t.

Batcher-féle rendezés A C sorozat a rendezett A és B sorozatok összefésülésével adódik. Tegyük fel, hogy A-ból az a 1, a s elemek, B-ből a b 1, b 2k-s elemek jönnek összefésüléssel a C sorozat első 2k elemébe: {c 1, c 2k } = {a 1, a s } { b 1, b 2k-s }

Batcher-féle rendezés {c 1, c 2k } = {a 1, a s } { b 1, b 2k-s } U-ba kerülnek a páratlan indexű elemek, ezek száma: s/2 V-be kerülnek a páros indexű elemek, ezek száma: s/2 U-ba kerülnek a páros indexű elemek, ezek száma: (2ks)/2 V-be kerülnek a páratlan indexű elemek, ezek száma: (2k-s)/2

Batcher-féle rendezés Az állítás ekkor egyenértékű azzal, hogy: s/2 + (2k-s)/2 = s/2 + (2k-s)/2? Ez nyilván igaz, ha s páros, hiszen ekkor minden tag egész. ha s páratlan, akkor a kérdés: (s+1)/2 +(2k-(s+1))/2 = (s-1) /2 + (2k-(s-1))/2 egyenlősége, és ez tényleg igaz.

Batcher-féle rendezés II. Eszerint: {c 1, c 2i } = {u 1, u i } { v 1, v i } {c 1, c 2(i-1) } = {u 1, u i-1 } { v 1, v i-1 } A két halmaz kivonásával: {c 2i-1, c 2i }={u i, v i } Így, mivel c 2i-1 < c 2i, tehát az eredeti állítás fennáll. U és V már egy párhuzamos lépésben összefésülhető.

Batcher-féle rendezés Hatékonyságelemzés: Párhuzamos költséget számolunk, ez azt jelenti, hogy akárhány összehasonlítás is csak 1-nek számít, ha párhuzamosan végezzük! 1. A PP_Merge rekurzív eljárást egy n méretű, két (közel) egyenlő méretű, rendezett két félből álló tömbre hajtjuk végre. n A B n/2 n/2

Batcher-féle rendezés A két félből párhuzamosan lehet képezni az U és V sorozatokat, itt tehát n/2 -t vesszük alapul. Mivel ugyanezt az eljárást használjuk az U és V előállítására is, ez a költségszámítás képletében is rekurziót ad. Továbbá, az U és V tömbökből egyetlen párhuzamos összehasonlítással kapjuk a C eredményt. Így az egyenlet: MÖ PP_M (n) MÖ PP_M ( n/2 ) +1 Itt egyébként elegendő MÖ helyett Ö-t írni, mert ez az eljárás fix összehasonlítás számmal dolgozik. Szokásos jelölés még: T (n) T( n/2 ) +1, T(1) = 0

Batcher-féle rendezés Ennek megoldása úgy történik általánosan is, ahogy egy konkrét értékre: például n = 21-re: T(21) T(11) + 1 T(6) + 1 + 1 T(3) +1 + 1 + 1 T(2) + 1 + 1 + 1 + 1 T(1) + 1 + 1 + 1 + 1 + 1 = = 0 + 1 + 1 + 1 + 1 + 1 = 5 = log 2 21 T(21) log 2 21 Ha v olyan egész, amire 2 v < n 2 v+1, akkor a rekurzív egyenletet éppen v +1-szer alkalmazzuk, mire eljutunk T(1)-ig. Így v +1 db egyest adunk össze, vagyis T(n) log 2 n Ez tehát a párhuzamos összefésülés költsége.

Batcher-féle rendezés 2. A párhuzamos rendező eljárás szerkezete pontosan az, ami a bevezetőben felidézett MergeSort-é, csak más összefuttatást alkalmaz.

Batcher-féle rendezés - tömbökre külső hívás: BatcherSort(S,1,n) BatcherSort(S, p, q) p q? r (p+q)/2 SKIP BatcherSort(S, p, r) BatcherSort(S, r+1, q) PP_Merge(S[p..r], S[r+1..q], S[p..q])

Batcher-féle rendezés 2. A párhuzamos összehasonlítás számra az egyenlet: Ö Batcher (n) Ö Batcher ( n/2 ) + log 2 n Egyszerűbb jelöléssel: T(n) T( n/2 ) + log 2 n Ha ezt is kifejtjük, akkor az előzőhöz hasonlóan azt kapjuk, hogy log 2 n számú tag lesz; ezek a tagok azonban csökkennek: T(n) T( n/2 ) + log 2 n T( n/2 2 ) + log 2 ( n/2 ) + log 2 n T(1) +1+2+ ( log 2 n -1) + log 2 n = (( log 2 n +1) * log 2 n )/2 (log 2 n) 2 /2 = ((log 2 n) 2 )

Batcher-féle rendezés Az előzőekben felhasználtuk, hogy log 2 ( n/2 ) = log 2 n -1, ezt be is látjuk: Ha n= 2 p, akkor igaz. Ha 2 p < n 2 p+1, akkor 2 p-1 < n/2 2 p, 2 p-1 < n/2 2 p p-1 < log 2 n/2 p, így log 2 ( n/2 ) = log 2 n -1

Külső rendezések Az eddig látott rendezéseknél feltettük, hogy az adatok a központi memóriában vannak. Ennek megfelelt, hogy a hatékonyságot az összehasonlítások számában mértük. Ha az adatok háttértárban vannak, akkor a futási idő döntő részét az I/O utasítások teszik ki. (Az I/O egysége az 1 blokk, ami k x 512 byte valamely kis k- val, pl. 102 v. 208 byte. Ezt lapnak is nevezik.) A háttértár lehet szalag v. lemez (ennek különféle változatai). A hatékonyságot a szükséges blokk I/O-k számában mérjük. Külső rendezésre igazából csak az összefésüléses rendezés (MergeSort) alkalmas.

Külső rendezések Az összefésüléses rendezés külső tárakon Adott egy S szekvenciális input fájl, amely n blokkból áll, minden blokkban adott számú rekorddal. ( Pl. 1 blokk = 102 byte és ezen 3 rekord foglal helyet.) A blokkok tartalma rendezetlen. Az összefésülést iteratív módon végezzük, úgy, hogy az egyes menetek végén egyre nagyobb darabok, vagyis egyre több szomszédos blokk lesz rendezett. Az összefésülést menetenként váltakozva az A, B, illetve a C,D fájlokba végezzük, végül a teljesen rendezett eredményt S-be írjuk. A közbülső menetekben azért lesz 2 output fájl, mert az összefuttatás eredményét az egyet ide, egyet oda elv alapján írjuk ki.

Külső rendezések 1.menet: beolvassuk S rendezetlen blokkjait, valamilyen belső rendezővel rendezzük, majd kiírjuk felváltva A-ba, illetve B-be. Itt még nem volt összefésülés.

Külső rendezések S: rendezetlen blokkok b1 b2 b3 b b5 b6 b7 b8 b9 Rendezés központi memória A b1 B rendezett blokkok

Külső rendezések S: rendezetlen blokkok b1 b2 b3 b b5 b6 b7 b8 b9 Rendezés központi memória A B b1 b2 rendezett blokkok

Külső rendezések S: rendezetlen blokkok b1 b2 b3 b b5 b6 b7 b8 b9 Rendezés központi memória A B b1 b3 b5 b7 b9 b2 b b6 b8 rendezett blokkok

Külső rendezések 2.menet: Sorban beolvassuk A és B 1-1 blokkját. Ezek rendezettek. Összefésüljük őket és a rendezett két blokkot felváltva C-be, illetve D-be írjuk. Az A utolsó blokkjának nincs párja, így azt kiírjuk C- be. A C és D fájlban a rendezett részek hossza 2 blokk, illetve a maradék esetében 1 blokk.

A Külső rendezések rendezett: 1 blokk B b1 b3 b5 b7 b9 b2 b b6 b8 összefuttatás központi memória C D b1- -b2 rendezett: 2 blokk

A Külső rendezések rendezett: 1 blokk B b1 b3 b5 b7 b9 b2 b b6 b8 összefuttatás központi memória C D b3- b1- -b2 -b rendezett: 2 blokk

A Külső rendezések rendezett: 1 blokk B b1 b3 b5 b7 b9 b2 b b6 b8 összefuttatás központi memória C D b5- b1- -b2 b3- -b6 b9 b7- -b -b8 rendezett: 2 blokk

3. menet: C-ből és D-ből olvasunk 2-2 rendezett blokkot, összefésüljük őket és felváltva A-ba és B-be írjuk a rendezett blokkot. A C-beli utolsó töredék blokk változatlanul A végére kerül.

A Külső rendezések rendezett: blokk B b2- b1- b3- -b összefuttatás központi memória C D b5- b1- -b2 b3- -b6 b9 b7- -b -b8 rendezett: 2 blokk

A Külső rendezések rendezett: blokk B b2- b1- b3- b5- -b b6- b7- -b8 összefuttatás központi memória C D b5- b1- -b2 b3- -b6 b9 b7- -b -b8 rendezett: 2 blokk

A Külső rendezések rendezett: blokk B b2- b1- b3- b5- -b b9 b6- b7- -b8 összefuttatás központi memória C D b5- b1- -b2 b3- -b6 b9 b7- -b -b8 rendezett: 2 blokk

Külső rendezések. menet: C-be kerül A és B - rendezett blokkja összefésülésének a 8 blokk hosszú rendezett eredménye, D-be pedig a maradék egy blokk.

A Külső rendezések rendezett: blokk B b2- b1- b3- b5- -b -b9 b6- b7- -b8 összefuttatás központi memória C D b2- b1- b3- b- b5- b6- b7- -b8 b9 rendezett: 8

Külső rendezések 5. menet: C 8 blokkját és D 1 blokkját összefésüljük S- be. Elnevezés: egy k blokkból álló összefüggő rendezett részt k hosszú futam nak nevezünk.

Külső rendezések S rendezett b2- b1- b3- b- b5- b6- b7- b8- -b9 összefuttatás központi memória C D b2- b1- b3- b- b5- b6- b7- -b8 b9 rendezett: 8 blokk

Külső rendezések Két kiegészítő megjegyzés: 1. Ebben a példában az S 9. blokkja csaknem végig nem került kapcsolatba más rendezett részekkel, csak az utolsó menetben került összefésülésre. Ha végrehajtjuk a fenti eljárást n=15-re, akkor a páratlan töredék maradék rész mérete így alakul: 1, 3, 7, vagyis a fenti jelenség nem törvényszerű. 2. Ha a központi memória mérete korlátozott és nem képes befogadni az egyre növekvő méretű rendezett részeket (futamokat), akkor ezek összefésülését lehet pufferelve, akár blokkonként végezni. Ez azért lehetséges, mert az összefuttatás egysége a rekord.

Külső rendezések Általában: 1. menet eredménye: 2. menet eredménye: 3. menet eredménye:. 1 hosszú futamok 2 hosszú futamok hosszú futamok (k-1). menet eredménye: 2 (k-2) hosszú futamok k. (utolsó) menet eredménye: 2 (k-1) hosszú egyetlen futam = S (előtte maradék mindig lehet)

Külső rendezések Az utolsó előtti (k-1). menetben még volt 2 futam: 2 (k-2) < n A k. (utolsó) menetben már előáll a teljes rendezett fájl: n 2 (k-1) Áttérve logaritmusra: k-2 < log 2 n k-1 k-1 = log 2 n A menetek k száma: k = log 2 n +1 Az összes blokk-i/o száma: 2*n*( log 2 n + 1) (minden menetben beolvastuk és kiírtuk mind az n blokkot)

Külső rendezések Gyorsítási lehetőségek: Nagyobb kezdő futamok létrehozása ha a központi memória lehetővé teszi, akkor az 1. menetben megtehetjük, hogy S-ből m >1 blokkot olvasunk be, ezt rendezzük és az így keletkezett m hosszú kezdőfutamokat írjuk ki A-ba és B-be. Ezután úgy megy tovább, hogy először két m hosszú futamot fésülünk össze, majd két 2m hosszút, stb.

Külső rendezések 1. menet eredménye: m hosszú futamok 2. menet eredménye: 2*m hosszú futamok 3. menet eredménye: *m hosszú futamok. (k-1). menet eredménye: 2 (k-2) *m hosszú futamok k. (utolsó) menet eredménye: 2 (k-1) *m hosszú egyetlen futam = S Innen: 2 (k-2) *m < n 2 (k-1) *m A menetek k száma: k = log 2 (n/m) +1 Az összes blokk-i/o száma: 2*n*( log 2 (n/m) + 1)

Külső rendezések Több, mint kétfelé fésülünk: Ha az S fájl mellett nem 2 x 2, hanem általában 2 x m fájllal dolgozunk, akkor ezzel a ráfordítással hatékonyabb eljárás nyerhető. Legyen pl. m= 3, n=13 és térjünk vissza az 1 hosszú kezdő futamokhoz: Ekkor az 1. menetben felváltva A, B, C-be írjuk ki a rendezett kezdőfutamokat. Ezután mindig három futamot fésülünk össze (a maradékoktól eltekintve) és az új futamokat felváltva A, B, C-be ill. D, E, F-be írjuk ki. Az utolsó menetben S-be írjuk az eredményt.

Külső rendezések S-ben n= 13 A B C D E F S 1. menet 1,1,1,1,1 1,1,1,1 1,1,1,1 2. menet 3,3, 3,1, 3 3.menet 9. menet 13

Külső rendezések A számolás: 1. menet eredménye: 1 hosszú futamok 2. menet eredménye: m hosszú futamok.. (k-1)-edik menet eredménye: k-adik utolsó menet eredménye: Innen: m k-2 < n m k-1 n m k-2 hosszú futamok m k-1 hosszú egyetlen futam=s k= log m n + 1= log 2 n/ log 2 m +1 Az összes blokk I/O művelet: 2n * ( log 2 n/ log 2 m +1)

Külső rendezések Három fájlos külső rendező Érdekes algoritmushoz jutunk, ha az m-felé fésülésnél nem 2m db fájl-t használunk, hanem csak m+1 db-t. Ezt m=2 esetére nézzük meg, ami az eredeti eset. Ekkor tehát 3 fájl-t használunk, mondjuk A, B, C-t. Az 1. menetben szétosztjuk S immár rendezett blokkjait A- ba és B-be. A második menetben elkezdjük A és B blokkjainak az összefésülését, de most csak 1 fájl tudja fogadni az eredményt, a C fájl. Ezért C-be fésülünk össze egészen addig, amíg A és B egyike ki nem ürül. Ekkor új menetet kezdünk a két nem üres fájllal s.i.t.

Külső rendezések Példa: S n=13 blokk A táblázatban az első szám a futamok számát jelenti, zárójelben pedig a futamok hossza áll. 1. 2. 3.. 5. 6. 7. 8. A 7(1) 1(1) 0 1(5) 0 1(9) 0 1(13)=S B 6(1) 0 1(3) 0 1(7) 0 1(11) 0 C 6(2) 5(2) (2) 3(2) 2(2) 1(2) 0 Látjuk, hogy a második menet végén képződött 6 db 2 hosszú futam csak egyesével tud elfogyni érezhetően sok lépésben. Ennek oka az, hogy az 1. menet végi két futamszámnak 1 a különbsége: 7-6=1

Külső rendezések Eszünkbe jut a Fibonacci sorozat: 0,1,1,2,3,5,8,13,. Ahol két szomszédos elem különbsége az első néhány tag kivételével 1-től különböző. Innen jön a gondolat, hogy az első menetben írjunk annyi futamot A-ba és B-be, mint a Fibonacci sorozat két (alkalmas) szomszédos eleme, és lépkedjünk visszafelé a sorozaton az egyes menetekben. 1. 2. 3.. 5. 6. A 8(1) 3(1) 0 2(5) 1(5) 0 B 5(1) 0 3(3) 1(3) 0 1(13)=S C 5(2) 2(2) 0 1(8) 0

Külső rendezések Belátható, hogy a 3 fájlos rendező éppen akkor fut le leggyorsabban, ha így járunk el, azaz A-ban és B-ben két szomszédos Fibonacci számnak megfelelő számú kezdő futamot hozunk létre. Ha N nem Fibonacci szám, akkor vagy levágjuk és félretesszük a felesleget, és a végén még összefésüljük a kialakult eredménnyel, vagy pedig éppen fordítva: (virtuális) kiegészítéssel alkalmasan megnöveljük az input állomány méretét.

Külső rendezések Nézzük meg, hány lépésben érjük el F k és F k-1 -ből az 1, 0 számokat úgy, hogy minden menetben egy újabb számot tudunk lefelé lépni: 1. 2.. (k-1). k. S F k+1 F k F k-1. 1 1 F k-1 F k-2. 1 0 Látható, hogy a menetek száma ekkor k, hiszen F k -től F 1 -ig vezet az út a táblázatban. Ki kell fejezni n-et F k+1 -gyel, ami az input fájl (közelítő) mérete blokkokban. Jelöljük N:=F k+1

Külső rendezések N:=F k+1 F 0 = 0, F 1 = 1, (F 2 = 1, F 3 = 2, F = 3, ) F k+1 = F k + F k-1 (k 1) F k = 1/ 5 * [((1+ 5)/2) k ((1-5)/2) k ] F k 1/ 5 * ((1+ 5)/2) k 1,6180-0,6180 Az A= (1+ 5)/2 az aranymetszés aránya, amely kielégíti az A 2 -A-1=0 egyenletet. Ezt átrendezve: A 2 =A+1, amiből teljes indukcióval megmutatható, hogy k 2 esetén: A k-2 F k A k-1 Ha N=F k+1, akkor A k-1 N, k-1 log A N = log 2 N/ log 2 A 1, * log 2 N k 1, * log 2 N +1