220 likes | 325 Views
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszé k Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő: Imre Mihály, műszaki informatikus hallgató. Önrendez ő listák 1.
E N D
Miskolci Egyetem Informatikai Intézet Általános Informatikai Tanszék Pance Miklós Adatstruktúrák, algoritmusok előadásvázlat Miskolc, 2004 Technikai közreműködő: Imre Mihály, műszaki informatikus hallgató
Önrendező listák1. Pl. a raktározási gyakorlatban a tételeket nem azonos gyakorisággal keressük (a tételek 15%-ára vonatkozik a keresések 85%-a). Tételezzük fel a következő hivatkozási gyakoriságot: Ekkor a keresés átlagos költsége: 2
Önrendező listák2. ........ Az átlagos költség tehát: Szekvenciális listában az elemeket a keresési gyakoriságukalapján csökkenő sorrendbe rendezzük. 3
Önrendező listák 3. MF: Move to Front: a hivatkozott elem előre megy T: Transpose: a hivatkozott elem a megelőzővel helyet cserél FC: Frequency Count: számol, rendez Sleator, Tarján: az MF módszer nem rosszabb bármely más módszer hatékonyságának kétszeresénél (a bizonyítás bonyolult). Ezért ezt nyugodtan használhatjuk. 4
4. szint 3.szint L[9] L[7] L[5] L[4] L[6] L[2] L[1] L[8] L[3] 2. szint 1. szint Skip lista 1. Többszintű, kulcs szerint rendezett láncolt lista. A pointerek száma: 5
Skip lista 2. Keresés: a bináris kereséshez hasonló 1.az i. szinten összehasonlítás, ha = megvan: vége, ha > az adott elemnél, akkor folytatás 2. 2.az i. szintű láncon előre megyünk, míg nagyobbat nem találunk, ha a szint végére értünk, akkor nincs a listában: vége 3.vissza az i. szinten a megelőző elemre, lelépünk az (i-1)-edik szintre ezen a helyen 4.ugrás 1. Hatékonysága O(log N), mindig feleződik az intervallum. 6
Skip lista 3. Beszúrás: pozíció megkeresése O(log N), célszerű ellentétes láncolat is a legalsó szinten 3N pointer kell. Pointer állítás így O(1), beszúrás O(log N). Ezzel torzul a skip lista tökéletessége, mert felette már nem valódi felező, negyedelő, stb. pointerek lesznek. Tökéletes skip lista: ahol pontosan középen vannak a láncolat elemei. Véletlen skip lista: csak körülbelül teljesül a felezés, átlagosan az i-edik szinten N/2ielemű a láncolat. 1 a valószínűsége, hogy egy elem az 1. szinten benne van a láncban 1/2 a valószínűsége, hogy egy elem a 2. szinten benne van a láncban 7
Skip lista 3. • 1/2i a valószínűsége, hogy egy elem az i. szinten benne van a láncban • N elem esetén log(N) a szintek száma, így a beszúrás algoritmusa a következő: • keressük meg az új elem helyét a listában • határozzuk meg az új elem max. szintszámát, úgy, hogy az i. érték 1/2i valószínűséggel kerüljön kiválasztásra. 1<= i <= log(N) (véletlenszám generálás) • fűzzük be az új elemet minden i-nél nem nagyobb szintű láncolatba 8
Rendezés A CPU idők ¼ -ét fordítják rendezésre. Kötetnyi irodalom foglalkozik vele.Feltételek: - a teljes lista beférjen a memóriába, - a kulcs egész, - a kiinduló sorrend az elemek egy permutációja, - csökkenő vagy növekvő sorrend, - a tételek átrendezését saját helyükön kell végrehajtani. Tömbök rendezése: belső rendezés. Soros fájlok rendezése: külsőrendezés. 9
Rendezés Stabil rendezés: az azonos kulcsú tételek relatív sorrendje a rendezés után nem változik. A hatékonyság mérésére: - a kulcs-összehasonlítások száma (C), - a tételmozgatások száma (M). Közvetlen módszerek: egyszerű (kicsi program), több művelet, kis N-re valók. Kifinomultabb módszerek: bonyolultabb, kevesebb művelet, nagy N-re valók. 10
Kiválasztásos rendezés for i =1 to N-1 begin mine= Li ; minp= i; for j = i + 1 to N if Lj < mine then begin mine= Lj ; minp= j ; end; if minp < > i then begin Lminp = Li ; Li =mine; end; end; Nem érzékeny az előrendezettségre, hatékonysága O(N2). 11
Beszúró rendezés 1. A j-edik elemet beszúrjuk az 1 .. j-1 rendezett listába. Átlagos hatékonysága O(N2), érzékeny az előrendezettségre. for i=2 to N begin j = i – 1 ; k = Li while k < Lj and j > 0 do begin Lj+1 = Lj ; j = j –1; end; Lj+1 = k; end; 12
Beszúró rendezés 2. Beszúrás javítása: L0 = Lj ; A beszúrási pozíciót bináris kereséssel határozzuk meg: bináris rendezés. Az összehasonlítások száma (C) csökkent, de M nem. De egy rendezett tömb újrarendezése több időt venne igénybe, mint a soros kereséssel. 13
Buborék rendezés 1. Szomszédos elemek permutációja, hatékonyság: O(N2) Elejétől a végéig: csere, ha a kisebb indexű elem értéke kisebb mint a nagyobb indexűé, így a legkisebb a végére kerül. Ezután a 2. legkisebb, és így tovább (a felső határt lehet lefelé tolni). N-1 pásztázás kell. 14
Buborék rendezés 2. Javítási lehetőségek: 1. minden menetben feljegyezzük, hogy volt-e csere, ha nem volt: vége. 2. melyik pozícióban volt utoljára csere. aszimmetrikus: egyetlen rossz helyen lévő elem a tömb nehezebbik feléről egyetlen menetben a helyére kerül, míg a könnyebbik részéről a rossz helyen álló elem menetenként csak egy pozícióval kerül a helye felé. 3. keverő rendezés: alulról – felülről (előről – hátulról) elemzése: a beszúró, kiválasztó jobb. Valójában a buborék rendezés alig ér egyebet hangulatos nevénél. Akkor hatásos csak, ha a tételek már majdnem rendezettek. 15
Shell rendezés 1. D. L. Shell (1959): Az elemeket nagyobb ugrásokkal próbálja meg végső helyükre tenni: - vegyünk egy intervallum hosszúság sorozatot, melynek kezdőértéke N-nél kisebb és utolsó eleme 1, - minden intervallum hosszúságra vesszük összes képezhető részsorozatot, - minden részlistára elvégezzük a beszúró rendezést. 16
Shell rendezés 2. Kevesebb mozgatás kell: O(N log2 N) Shell: N/2, N/4, N/8, … O(N2) 2k-1 : 1, 3, 7, 15, ....: O(N3/2) O(N7/6) nem bizonyított 17
Quick (gyors) rendezés 1. • C. A. R. Hoore (1962): • Általában a leghatékonyabb, az oszd meg és uralkodj alapelv szerint működik: • felosztási fázis, két részre bontás, • részfeladatok megoldása, • egyesítési fázis. 18
Lb Lj < rekurzívan Pj Pb L1 Ln Lk Quick sort2. 19
Quick sort3. - Pb az első elemre mutat - Pj az utolsó elemre mutat - L[Pb] <= L[k] ha igen, akkor Pb += 1, ha nem megállunk - L[Pj] >= L[k] ha igen, akkor Pj - = 1,ha nem megállunk - ha mindkettő megállt, felcseréljük őket, léptetés előre, vissza - mindaddig amíg a két pointer nem találkozik, így kialakul a két részintervallum - folytatás rekurzívan a részintervallumokon 20
Quick sort4. A hatékonyság függ a két részintervallum relatív méretétől, ha egyformák, akkor feleződik és log N szint kell. Minden szinten minden elemet egyszer át kell nézni: O(N log N) átlagosan. Worst case: az egyik részbe csak 1 elem kerül:O(N2). A határelem (pivot elem) választásán múlik minden, legjobb ha ez véletlenszerű, vagy 3 alapuló elemen középső érték: a = ab ; b = a(b+j) div 2 ;c = aj ifa > b then csere(a,b) ifa > c then csere(a,c) ifb > c then csere(b,c) x = b; {középső} 21
Quick sort5. Megjegyzések: - kis tömbökre ne alkalmazzuk:D. Knuth: 9. (eljárás hívás, programozási nyelvtől függ)beszúrásos módszerrel folytatni, mivel valószínűleg eléggé előrendezettek. - rekurzió helyett ciklus - pointer tömb (rekord….) - Quick opt(B. Breutmann) 22