6. Előadás - Rendező algoritmusok
Rendező algoritmusok
A
reflexív:
antiszimmetrikus:
és eseténtranzitív:
és esetén
A teljes rendezés esetében elvárjuk azt is, hogy a halmaz bármely két kiválasztott eleme között legyen reláció.
Beszúrásos rendezés
Az algoritmus működése
Kiindulunk egy üres eredmény sorozatból.
Az eredeti tömb elemeit sorban beszúrjuk úgy, hogy mindig rendezett sorozatot kapjunk.
A beszúrás mindig a tömb végétől kezdve történik. (A tömb elejétől kezdve költségesebb lenne.)
Párhuzamosítás
Megpróbálhatunk beszúrni úgy elemeket, hogy a korábbi beszúrások még tartanak.
A beszúrást végző iterátorok között megfelelő távolságnak kell lenni.
A beszúrandó elemeket rendezni kell, és a kisebb értékeket kell először beszúrni. (Ez egy független rendezési feladat, melyhez szintén használható például a beszúró rendezés.)
Elvi szinten a megoldás működik, de szinkron működést feltételez.
Szálak szintjén a szinkronizációs költség aránytalanul nagy.
Minimumkiválasztásos rendezés
Az algoritmus működése
Kiindulunk egy üres eredmény sorozatból.
A bemeneti sorozatunknak megkeressük a minimumát.
Ezt beszúrjuk az eredménysorozat végére.
Az előző két lépést addig ismételjük, amíg el nem fogynak az elemek a bemeneti sorozatból.
Párhuzamosítás
(I.) A minimum keresést párhuzamosíthatjuk.
Tetszőlegesen sok számítási egység esetében a keresés
időre csökkenthető.A teljes számítási idő így:
Ez ugyan gyorsabb lesz, mint az eredeti
időbonyolultság, de nem elég hatékony így sem (a következőkben bemutatásra kerülő algoritmusokhoz képest).
(II.) Csoportokat képezhetünk
A négyzetes rendezés analógiájára elképzelhető a következő algoritmus.
Tegyük fel, hogy van
darab számítási egységünk.Osszuk fel a rendezendő tömbünket
részre.A
számú számítási egységgel határozzuk meg minden résztömbnek a saját minimumát.A
számítási egységnek allokáljunk egy méretű segédtömböt, amelybe belekerülnek a csoportonkénti minimumok.Kezdjük el kiszámolni a résztömbökben maradt következő minimumot. Közben számítsuk ki a segédtömb minimumát.
A kapott minimumot írjuk az eredménytömb végére.
Amint egy minimumot kivettünk a segédtömbből, írjuk be a helyére a hozzá tartozó csoport következő minimum értékét. (Itt előfordulhat, hogy a
számítási egységnek várni kell a minimumérték meghatározására.)Folytassuk addig az eljárást, amíg minden érték el nem fogy a csoportokból.
A számítás akkor tud hatékony lenni, hogy ha a minimumértékek mindig más csoportokból kerülnek ki. Az algoritmus egyik legrosszabb esete a rendezett tömb.
Összefésülés
Két bemeneti tömbös változat
Egy bemeneti tömbös változat
Batcher-féle páros-páratlan összefésülés
Tegyük fel, hogy adott egy
Bontsuk fel ezeket külön tömbökre az indexek paritása szerint!
Fésüljük össze ezeket az
A
Összefésülő rendezés
Feltételezzük, hogy tetszőleges sok számítási egység rendelkezésünkre áll!
Csak az összehasonlítási műveleteket vegyük figyelembe!
Buborék rendezés
Az alapötlete az, hogy
elegendő a szomszédos elemeket páronként ellenőrízni, hogy a sorozat rendezett-e, és
ha nem megfelelő a pár sorrendje, akkor meg kell cserélni a két elemet.
Az algoritmusnak (szekvenciális esetben is) több változata elképzelhető. A sorozat bejárása történhet
az alacsonyabb indexektől a magasabbak felé, vagy
a magasabbaktól az alacsonyabbak felé.
Párhuzamosítás
Az algoritmus párhuzamosítása problémás.
A rendezési mód nehezen fogalmazható meg rekurzív formában.
Az elem mozgatása az egész tömbre értendő (tehát a problématér felosztása is körülményes). Ez zárolást tenne szükségessé.
Szinkron rendszert feltételezve indíthatunk párhuzamosan több rendező iterátort.
A közöttük lévő különbségnek legalább 1-nek kell lennie.
Az utolsónak kell tudni megállapítani, hogy a rendezés során történt-e csere.
Egy iterációt követően
-vel nő a már rendezett elemek száma.Erősen szinkron működést igényel, hogy az iterátorok ne akadjanak össze.
A gyakori szinkronizáció költsége nagyobb lehet, mint az összehasonlításé és a cseréjé.
Shell rendezés
tömböt a
Párhuzamosítás
Az azonos távolságokra lévő elemek az egyes iterációkban párhuzamosan rendezhetők.
Jelezzük külön az összehasonlítás és a csere műveleteket!
Feltételezzük, hogy a kettő műveleti ideje azonos!
Gyorsrendezés
A felosztáshoz használt algoritmus pszeudó kódja:
A gyorsrendezés algoritmusa:
Párhuzamosítás
A felosztást követően a résztömbök függetlenül rendezhetők.
Leszámláló rendezés
A
Párhuzamosítás
A 4 lépésnek egymás után kell következnie. Párhuzamosításra azokon belül van lehetőség.
Teljesen párhuzamosítható.
A
segédtömbhöz való hozzáférés miatt ilyen formában zárolásra van szükség.Prefix számítási problémaként kezelhető.
Szekvenciálisan hajtandó végre.
Kérdések
Adjon példát egy véges (kis elemszámú) halmazon részben rendezésre!
Milyen a beszúrásos rendezés időbonyolultsága?
Milyen a minimumkiválasztásos rendezés időbonyolultsága?
Milyen az összefésülés időbonyolultsága
és méretű bemenetek esetében?Miért előnyös az összefésülő rendezés esetében a
érték ilyesfajta megválasztási módja? Működne-e az algoritmus tetszőleges esetében?Milyen a buborékrendezés időbonyolultsága?
A Shell rendezés esetében mi az elvárás a növekmények sorozatára vonatkozóan?
Mi a legrosszabb esete a gyorsrendezésnek (feltéve, hogy mindig az első elemet választjuk pivót elemnek)?
Egy 32 elemű tömb rendezése esetében mennyi az optimális rekurzív hívási fa magassága?
Feladatok
Beszúró rendezés
Írja fel a beszúró rendezés pszeudó kódját!
Mérje le és ábrázolja a kapott eredményeket a beszúró rendezés időbonyolultságára vonatkozóan!
Vizsgáljuk meg egy 10 elemű minta rendezése esetében, hogy két beszúró iterátor használatával milyen gyorsítás érhető el! (Feltételezzük, hogy a számítások várakoztatás nélkül párhuzamosan futnak!)
Minimumkiválasztásos rendezés
Írja fel a minimumkiválasztásos rendezés pszeudó kódját!
Végezzen méréseket az algoritmus időbonyolultságára vonatkozóan!
Írjon egy rekurzív felbontásra épülő párhuzamos algoritmust a rendezési feladat megoldására!
Hasonlítsa össze azonos bemenetek esetén a szekvenciális és a párhuzamos futási időket!
Összefésülő rendezés
Írja fel annak az algoritmusnak a pszeudó kódját, amelyik párhuzamosan fésüli össze a két bemeneti tömb elejét és végét!
Írja át a
COPY
műveletet egy procedúrára úgy, hogy szerepeljenek benne a másoláshoz használt indexek! (Feltételezzük, hogy az eredmény tömb allokálása automatikusan megtörténik.)Írja fel a 2. és 3.
WHILE
ciklust aCOPY
eljárás meghívásával!Végezzen becsléseket arra vonatkozóan, hogy milyen gyorsítás lenne elérhető, hogy ha a
COPY
műveleteket teljesen párhuzamosítva lehetne végrehajtani! (Ehhez készítsen véletlenszerű bemenetekkel futtatásokat, amelyekkel az eredeti összefésülő algoritmust felhasználva meghatározhatja a konkrét összehasonlítások és értékbeállítások számát!)