4.. Redezés Defiíció: A reláció Valamely A halmaz eseté a ρ A A részhalmazt az A halmazo értelmezett relációak evezzük. Azt modjuk, hogy az A halmaz a és b eleme a ρ relációba va, ha (a,b) ρ. Rövide ezt így írjuk: aρb.. Példa: A=R, és a reláció a kisebb < jel. Az aρb reláció azokat a számpárokat jeleti, amelyekre feáll az a<b összefüggés. Defiíció: A redezési reláció A ρ relációt redezési relációak evezzük az A halmazo, ha. reflexív, azaz aρa a A eseté;. aρb és bρa maga utá voja az a=b teljesülését; 3. trazitív, azaz aρb és bρc maga utá voja az aρc teljesülését; 4. atiszimmetrikus, azaz vagy az aρb, vagy a bρa áll fe a,b A eseté.. Példa: A valós számok közötti reláció. Redezésről olya adattípus eseté beszélhetük, amelyre értelmezve va egy redezési reláció. Tekitsük a sorozatot és aak is vegyük a tömbös realizációját. A redezés a sorozat elemeiek olya felsorolását jeleti, amelybe az egymást követő elemek a megadott relációba vaak. A tárgyalást valós számoko (legikább egészek) visszük végig és relációak a kisebb, egyelő relációt tekitjük. ami em csökketi az általáosságot. A redezés mid a mai időkig fotos iformatikai probléma. Gyakra jeleik meg mit egy agyobb probléma része. A redezési algoritmusokkal kapcsolatba több szempot szeriti igéy léphet föl. Ilyeek például az alábbiak: a. Helybe redezés. A redezés eredméye az eredeti helyé jeleje meg, legfeljebb kostas méretű többletmemória felhaszálása révé. b. A redezési idő legye miél rövidebb. c. Az algoritmus haszálja ki a kulcsok között már meglévő redezettséget. (Adaptivitás) d. A redezés legye stabil, azaz őrizze meg az azoos kulcsú rekordok eseté a rekordok egymáshoz képesti eredeti sorredjét. (Például telefoszámlák készítésekor az azoos kulcsú előfizetői hívások időredi sorredje maradjo meg.) e. Az algoritmus csak a kulcsokat redezze a rekordokra mutató poiterekkel, vagy az összes rekordot mozgassa. f. Belső redezés legye (csak a belső memóriát vegye igéybe a redezéshez), vagy külső redezés legye (háttértárakat is igéybe vehet). g. Összehasolításo alapuljo a redezés, vagy azt e vegye igéybe az algoritmus. (Ez utóbbi esetbe a kulcsokra további megszorításokat kell tei.) h. Optimális legye a redezési algoritmus, vagy sem. (Nem biztos, hogy az adatok az optimális algoritmus által megkívát módo vaak megadva.) i. Az összes redezedő adatak redelkezésre kell-e állia a redezés teljes folyamata alatt, vagy sem. Nem lehet kizári a em optimális algoritmusokat sem az alkalmazásokból, mert egy probléma megoldásába em csak a redezési algoritmus optimalitása az egyetle szempot a problémamegoldás hatékoyságára. (Hiába gyors az algoritmus, ha az adatok em a kívát formába állak redelkezésre, és a koverzió lerotja a hatékoyságot.)
Adatstruktúrák, algoritmusok - - 4... A beszúró redezés A beszúró redezés alapelve agyo egyszerű. A sorozat második elemétől kezdve (az első ömagába már redezett) egyekét a kulcsokat a sorozat eleje felé haladva a megfelelő helyre mozgatjuk összehasolítások révé. A sorozatak a vizsgált kulcsot megelőző elemei midig redezettek az algoritmus sorá. 3. Példa: Az alábbi kulcsok eseté yíl mutatja a mozgatadó kulcsot és a beszúrás helyét. 8 4 3 6 5 9 7 4 8 3 6 5 9 7 4 8 3 6 5 9 7 3 4 8 6 5 9 7 3 4 8 6 5 9 7 3 4 6 8 5 9 7 3 4 5 6 8 9 7 3 4 5 6 8 9 7 3 4 5 6 7 8 9 4... algoritmus Beszúró redezés // T( ) = Θ( ) BESZÚRÓ_RENDEZÉS ( A ) // Iput paraméter: A - a redezedő tömb 3 // Output paraméter: A - a redezett tömb 4 // 5 FOR j TO hossz [ A ] DO 6 kulcs A j 7 Beszúrás az A...j redezett sorozatba 8 i j 9 WHILE i > 0 és A i > kulcs DO A i + A i DEC(i) A i + kulcs 3 RETURN (A) = -et! Feladat: Készítsük el a beszúró redezésre a pszeudokódot, ha a kulcsok egy kétszerese lácolt listával vaak megadva! Feladat: Számítsuk ki a beszúró redezésre a T( ) Θ( )
Adatstruktúrák, algoritmusok - 3-4... Az összefésülő redezés Az összefésülő redezés alapelve az összefésülés műveleté alapszik, amely két redezett tömbből egy új redezett tömböt állít elő. Az összefésülés folyamata: Midkét tömbek megvizsgáljuk az első elemét. A két elem közül a kisebbiket beírjuk az eredméytömb első szabad eleme helyére. A felszabaduló helyre újabb elemet veszük abból a tömbből, ahoa előzőleg a kisebbik elem jött. Ezt a tevékeységet folytatjuk midaddig, míg valamelyik kiiduló tömbük ki em ürül. Ezutá a még vizsgálat alatt lévő elemet, valamit a megmaradt másik tömb további elemeit sorba az eredméytömbhöz hozzáírjuk a végé. Az eredméytömb em lehet azoos egyik bemeeti tömbbel sem, vagyis az eljárás em helybe végzi az összefésülést. Legye ÖSSZEFÉSÜL ( A, p, q, r ) az az eljárás, amely összefésüli az A p.. q és az A q +.. r résztömböket, majd az eredméyt az eredeti A p.. r helyre másolja vissza. Az eljárás lieáris méretű további segédmemóriát igéyel. Az összefésülés időigéye Θ(), ha összese elemük va. (Egy meetbe elvégezhető és az kell is hozzá.) Defiíció: Az oszd meg és uralkodj elv Az oszd meg és uralkodj elv egy algoritmus tervezési stratégia A problémát olya kisebb részekre osztjuk föl, amelyek rekurzíva megoldhatók. Ezutá egyesítjük a megoldásokat. Az összefésülő redezés oszd meg és uralkodj típusú algoritmus, melyek az egyes fázisai: Felosztás: A tömböt két elemű részre osztjuk Uralkodás: Rekurzív összefésüléses módo midkettőt redezzük. (Az elemű már redezett) Egyesítés: A két részsorozatot összefésüljük. 4... algoritmus Összefésülő redezés (Merge Sort) T // ( ) = Θ( log ) ÖSSZEFÉSÜLŐ_RENDEZÉS ( A, p, r ) // Iput paraméter: A - a tömb, melyek egy részét redezei kell 3 // p - a redezedő rész kezdőidexe 4 // r - a redezedő rész végidexe 5 // Output paraméter: A - a redezett résszel redelkező tömb 6 // 7 IF p < r 8 THEN p + r q 9 ÖSSZEFÉSÜLŐ_RENDEZÉS ( A, p, q ) 0 ÖSSZEFÉSÜLŐ_RENDEZÉS ( A, q +, r ) ÖSSZEFÉSÜL ( A, p, q, r ) RETURN (A) A teljes tömb redezését megoldó utasítás: ÖSSZEFÉSÜLŐ_RENDEZÉS(A,,hossz[A]). Az összefésülő redezés időigéye
Adatstruktúrák, algoritmusok - 4 - Felosztás: Θ () Uralkodás: Egyesítés: Θ ( ) T T ( ) = ( ) Θ, T + Θ ( ), ha ha = > ( ) ( ) Az algoritmus időigéye megkapható a mester tétel. potja alapjá: T = Θ log. 4..3. A Batcher-féle páros-páratla összefésülés Az eljárás csak az összefésülést teszi hatékoyabbá. Nem öálló redező módszer. Nagy előye, hogy párhuzamosíthatók a lépései. Legye két redezett sorozatuk: A = {a,,a l } B = {b,,b m } A két sorozat összefésülése adja a C = {c,,c l+m } sorozatot. Az összefésülés módja a következő: Midkét kiiduló sorozatból kettőt képezük, a páratla idexű és a páros idexű elemek sorozatait: A = {a,a 3,a 5, } B = {b,b 3,b 5, } A = {a,a 4,a 6, } B = {b,b 4,b 6, } Összefésüljük az A,B sorozatokat, eredméye az U sorozat. Összefésüljük az A,B sorozatokat, eredméye a V sorozat. Összefésüljük az U és V sorozatokat, eredméy a C sorozat. Tétel: Bizoyítás A Batcher-féle összefésülés tétele A Batcher összefésülés sorá c i- = mi { u i, v i } és c i = max { u i, v i }, i ( l + m ) / Fogadjuk el kiiduláskét igazak azt a feltevést, hogy C elejéből páros számú elemet véve azok között azoos számú U és V elem va. Ekkor {c,,c (i-) }= {u,,u i- } {v,,v i- } és {c,,c i }= {u,,u i } {v,,v i } Ebből viszot {c i-,c i }={u i,v i }, ahoa c i- < c i miatt adódik a tétel állítása. A feltételezésük bizoyítása: Legye {c,,c k }={a,,a s } {b,,b k-s }. Ezek közül U-ba kerül s/ elem az A-ból (az A páratla idexű elemei) és (k-s)/ elem a B-ből (a B páros idexű elemei), Valamit V-be kerül s/ elem az A-ból (az A páros idexű elemei) és (k-s)/ elem a B-ből (a B páratla idexű elemei). Ie az U-beliek száma s/ + (k-s)/ = k és a V-beliek száma s/ + (k-s)/ = k 4..4. Gyorsredezés (oszd meg és uralkodj típusú algoritmus) Felosztás: Az A p.. r tömböt két emüres A p... q és A q +... r részre osztjuk úgy, hogy A p... q mide eleme kisebb egyelő legye, mit A q +... r bármely eleme. (A megfelelő q meghatározadó.) Uralkodás: Az A p... q és A q +... r résztömböket rekurzív gyorsredezéssel redezzük. Egyesítés: Nics rá szükség, mivel a tömb már redezett. (A saját helyé redeztük.)
Adatstruktúrák, algoritmusok - 5-4..4.. algoritmus Gyorsredezés (Quick Sort) T Θ T = Θ log // ( ) ( ) =, átlagos: ( ) ( ) GYORSRENDEZÉS(A,p,r) // Iput paraméter: A - a tömb, melyek egy részét redezei kell 3 // p - a redezedő rész kezdőidexe 4 // r - a redezedő rész végidexe 5 // Output paraméter: A - a redezett résszel redelkező tömb 6 // 7 IF p < r 8 THEN FELOSZT ( A, p, r, A p, q) // 4..5. algoritmus 9 GYORSRENDEZÉS ( A, p, q ) 0 GYORSRENDEZÉS ( A, q+, r ) RETURN (A) A gyorsredezés időigéye: A legrosszabb eset: a felosztás mide lépésbe, elemű T () = Θ(), T ( ) = T ( ) + Θ( ) = T + Θ = T + Θ + Θ = K T ( ) ( ) ( ) ( ) ( ) ( ) = = T + Θ + Θ + K+ Θ = Θ k = Θ k= () () ( ) ( ) ( ) A legjobb eset:, a felosztás, ekkor T = Θ, () () T ( ) = T + Θ( ), ha > Ez megegyezik az összefésülő módszer formulájával, tehát T ( ) = Θ( log ) Megjegyzés: ha a felosztás aráya álladó pl. 0 9, 0, akkor a rekurziós formula: 9 T + + 0 0 Eze túlmeőe az átlagos értékre is T ( ) = T T Θ( ). Bizoyíthatö, hogy ekkor is ( ) = Θ( log ) ( ) = Θ( log ) T. adódik. 4..5. A buborékredezés A buborékredezésél az egymás mellett álló elemeket hasolítjuk össze, és szükség eseté sorredjüket felcseréljük. Ezt midaddig folytatjuk, míg szükség va cserére. 4..5.. algoritmus Buborékredezés (Bubble Sort) T // ( ) = Θ( ) BUBORÉKRENDEZÉS(A) // Iput paraméter: A - a redezedő tömb
Adatstruktúrák, algoritmusok - 6-3 // Output paraméter: A - a redezett tömb 4 // 5 j 6 REPEAT emvoltcsere igaz 7 FOR i hossz[a] DOWNTO j DO 8 IF A i < A i - 9 THEN csere A i A i - 0 emvoltcsere hamis INC(j) UNTIL emvoltcsere 3 RETURN (A) Időigéy a legrosszabb esetbe: (-)/. Sok a csere, az elem lassa kerül a helyére. 4..6. A Shell redezés (redezés fogyó övekméyel) A Shell redezés a buborékredezésél tapasztalt lassú helyrekerülést igyekszik felgyorsítai azáltal, hogy egymástól távol álló elemeket hasolít és cserél fel. A távolságot fokozatosa csökketi, míg az em lesz. Mide övekméy eseté beszúrásos redezést végez az adott övekméyek megfelelő távolságra álló elemekre. Mire a övekméy lesz, sok elem már majdem a helyére kerül. A övekméyek felépítése. Haszáljuk t számú övekméyt. Legyeek ezek h..t. A követelméy: h t =, és h i + < h i, i=,, t - Irodalmi javasolt övekméyadatok:, 3, 6, 8, 4,, t= log - h i- =h i, 40, 3, 4, h i- =3h i + 3, 5, 7, 3, h i- =h i + 4..6.. algoritmus Shell redezés //, T( ) = Θ( ) SHELL_RENDEZÉS(A) // Iput paraméter: A - a redezedő tömb 3 // Output paraméter: A - a redezett tömb 4 // 5 FOR M TO t DO 6 K h[m] 7 S - k 8 FOR i k + TO hossz[a] DO 9 x A i 0 j i - k IF s = 0 THEN s - k 3 s s + 4 A s x
Adatstruktúrák, algoritmusok - 7-5 WHILE x < A j DO 6 A j + k A j 7 j j - k 8 A j + k x 9 RETURN (A) Megjegyzés: A hossz[a] a redezedő elemek számát jelöli. Az A tömböt az elejé még kiegészítjük t darab rekesszel, amelyekbe meet közbe a strázsa elemek kerülek., Időigéy: alkalmas övekméy választással leszorítható T( ) Θ( ) 4..7. A miimum kiválasztásos redezés = -re. Hossz[A]- -szer végigmegyük a tömbö. Mide alkalommal eggyel későbbi elemtől iduluk. Megkeressük a miimális elemet, és azt az aktuális meet első elemével felcseréljük. 4..7.. algoritmus Miimum kiválasztásos redezés T = Θ // ( ) ( ) SHELL_RENDEZÉS(A) // Iput paraméter: A - a redezedő tömb 3 // Output paraméter: A - a redezett tömb 4 // 5 FOR i TO hossz[a]- DO 6 // miimumkeresés 7 k i 8 x A i 9 FOR j i + TO hossz[a] DO 0 IF A j < x THEN k j x A j 3 // az i. elem és a miimum felcserélése 4 A k A i 5 A i x 6 RETURN (A) Időigéy: összehasolításszám T( ) Θ( ) =. 4..8. Négyzetes redezés Felosztjuk az A tömböt számú elemet tartalmazó részre (alcsoportra). Midegyikből kiemeljük (eltávolítjuk) a legkisebbet. A kiemeltek alkotják a főcsoportot. Kiválasztjuk a legkisebbek legkisebbikét ( a legkisebbet a főcsoportból ) és azt az eredméytömbbe írjuk, a főcsoportból pedig eltávolítjuk ( töröljük ). Helyére abból az alcsoportból ahoa ő jött újabb legkisebbiket emelük be a főcsoportba. Az eljárást folytatjuk, míg az elemek el em fogyak a főcsoportból.
Adatstruktúrák, algoritmusok - 8 -,5 Időigéy: összehasolításszám T ( ) Θ( ) = Θ( ) =. Továbbfejlesztett változat, amikor /3 számú elem va egy fő-főcsoportba és /3 számú főcsoport va, midegyikbe /3 számú elemmel, melyek midegyikéhez egy /3 elemszámú 4 3 = Θ = Θ 3 T alcsoport tartozik. A redezés elve a fetihez hasoló. Időigéy: ( ) ( ) 4..9. A Stirlig formula és az Alsó korlát összehasolító redezésre tétel Tétel: Bizoyítás A Stirlig formula Igaz az alábbi összefüggés az!-ra: + ( + ) <! <, =3,4,5, e e Az egyelőtleséget a logaritmusra látjuk be. A logaritmus függvéy kokáv és emiatt írható: l l l l (! ) = l + l 3 + l 4 + K+ l (! ) > l x dx = l x dx = [ x l x] (! ) = l [] x = l ( ) = l + > l = l + l + l 3 + l 4 + K+ l x dx = x + + + (! ) < l x dx = l x dx = [ x l x] [ x] = = ( + ) l ( + ) ( + ) = ( + ) l ( + ) () Az összehasolító módszerek dötési fája
Adatstruktúrák, algoritmusok - 9 - a a? ige em a a 3? a a 3? ige em ige em,, 3,, 3 a a 3? a a 3? ige em ige em, 3,, 3, 3,, 3,, Tétel: Bizoyítás Alsó korlát összehasolító redezésre Bármely elemet redező dötési fa magassága T ( ) = Ω( log ) Egy h magasságú dötési fa leveleiek száma legfeljebb h. Mivel mide permutációt redezi kell tudia az algoritmusak, és összese! permutáció lehetséges, ezért a dötései fáak h legalább! levele kell legye. Tehát feáll. Logaritmálva: h log!. A Stirlig formula szerit h log = log loge. e Tehát: h = Ω log ( )! ( )!>. Behelyettesítve: e 4..0. Lieáris idejű redezők: A leszámláló redezés A lieáris idejű redezők em haszálják az összehasolítást. A leszámláló redezés ( = bisort, ládaredezés) bemeete és k közötti egész szám. Időigéy: T ( ) = Θ( + k). Ha k = Θ( ), akkor a redezési idő is T ( ) = Θ( ), ahol =hossz[a]. Az elemeket az A.. tömbbe helyezzük el. Szükség va további két tömbre: B.. az eredméyt tárolja majd, C..k segédtömb.
Adatstruktúrák, algoritmusok - 0 - A redezés léyege, hogy A mide elemére meghatározza a ála kisebb elemek számát. Ez alapjá tudja az elemet a kimeeti tömb megfelelő helyére tei. Stabil eljárás: az azoos értékűek sorredje megegyezik az eredetivel 4..0.. algoritmus Leszámláló redezés // T ( ) = Θ( ) LESZÁMLÁLÓ_RENDEZÉS ( A, k, B ) // Iput paraméter: A - a redezedő tömb 3 // k kulcs felső korlát, pozitív egész 4 // Output paraméter: B - a redezett tömb 5 // 6 FOR i TO k DO 7 C i 0 8 FOR j TO hossz[a] DO 9 INC ( C Aj ) 0 // C i azt mutatja, hogy háy i értékű számuk va FOR i TO k DO C i Ci + Ci 3 // C i most azt mutatja, hogy háy i-től em agyobb számuk va 4 FOR j hossz[a] DOWNTO DO 5 B C Aj A j 6 DEC ( C ) A j 7 RETURN (B) 4... A számjegyes redezés (radix redezés) Azoos hosszúságú szavak, strigek redezésére haszálhatjuk. (Dátumok, számjegyekből álló számok, kártyák, stb.) Legye d a szó hossza, k pedig az egy karaktere, mezőbe előforduló lehetséges jegyek, jelek száma, pedig az adatok száma. Időigéy: T ( ) = Θ( d ( + k) ) 4... algoritmus Számjegyes redezés // T ( ) = Θ( d ( + k) ) SZÁMJEGYES_RENDEZÉS ( A ) // Iput paraméter: A - a redezedő tömb 4 // Output paraméter: A - a redezett tömb 4 // 5 FOR i d DOWNTO DO 6 Stabil módszerrel redezzük az A tömböt az i. számjegyre 7 RETURN (A)
Adatstruktúrák, algoritmusok - - 4... Edéyredezés Feltételezzük, hogy a bemeet a [0, ) itervallumo egyeletes eloszlású számok sorozata. Felosztjuk a [0, ) itervallumot egyelő részre (edéyek). A bemeetet szétosztjuk az edéyek között, mide edéybe egy listát kezelve. Az azoos edéybe esőket beszúrásos módo redezzük. A végé a listákat egybefűzzük az elsővel kezdve. Várható időigéy: T ( ) = Θ( ) 4... algoritmus Edéyredezés // ( ) ( T = Θ ) EDÉNYRENDEZÉS ( A, L ) // Iput paraméter: A - a redezedő tömb, elemű 3 // Output paraméter: L - a redezett elemek listája 4 // Meet közbe szükség va egy elemű B tömbre, mely listafejeket tárol. Idexelése 0-val idul. 5 hossz[a] 6 FOR i TO DO 7 Beszúrjuk az A i elemet a listába B 8 FOR i 0 TO - DO 9 Redezzük a B i listát beszúrásos redezéssel 0 Sorba összefűzzük a B 0, B,, B - listákat. képezve az L listát RETURN (L) 4..3. Külső tárak redezése Külső tárak redezéséél az elérési és a mozgatási idő szerepe drasztikusa megő. Az összefésüléses módszerek jöek elsősorba számításba. A i Defiíció: A k hosszúságú futam file-ba Egy file k szomszédos rekordjából álló részét k hosszúságú futamak evezzük, ha bee a rekordkulcsok redezettek (pl.: övekedő sorredűek). Először alkalmas k-val (k= midig megfelel) a redezedő file-t két másik file-ba átmásoljuk úgy, hogy ott k hosszúságú futamok jöjjeek létre. Ezutá a két file-t összefésüljük egy-egy elemet véve midkét file-ból. Az eredméyfile-ba már k lesz a futamhossz.(esetleg a legutolsó rövidebb lehet). Ezt ismételgetjük a teljes redezettségig midig duplázva k értékét. Legye a rekordok száma. Egy meetbe rekordmozgás va a szétdobásál és az összefésülésél. A meetek száma legfeljebb log. Az időigéy: T ( ) = Θ( log ). Külső tárak redezéséek gyorsítása Az log em javítható az összehasolítások miatt. A szorzó kostasokat lehet csökketei. Változó futamhosszak: a file-ba meglévő természetes módo kialakult futamhosszakat vesszük figyelembe. A futamhatárok figyeléséek admiisztrálása bejö, mit további költség.
Adatstruktúrák, algoritmusok - - Több részfile haszálata eseté a szétdobás em két, haem több részre törtéik. Külö admiisztráció összefésülésél a kiürült file-ok figyelése. Polifázisú összefésülés alkalmazásakor em folytatjuk végig mide meetbe az összefésüléseket, haem a célfile szerepét midig a kiürült file veszi át és ide kezdjük összefésüli a többit Egy eset polfázisú összefésülésre, amikor kíosa lassú a módszer. A tábla belsejébe a fileok futamszáma szerepel, zárójelbe a futamok mérete. Kezdetbe az első file rekordból áll és egy a futamhossz, a második file 5 rekordból áll és szité egy a futamhossz. meet és futamszám File 3 4 5 6 () 0 (3) 0 (5) 0 5() 4() 3() () () 0 3 0 () 0 (4) 0 (6)