miskolci egyetem informatikai intézet Általános informatikai tanszé k pance miklós
Post on 19-Jan-2016
25 Views
Preview:
DESCRIPTION
TRANSCRIPT
Miskolci EgyetemInformatikai 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.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:
12
1 , ... ,
8
1 ,
4
1 ,
2
1N
11 2
1 ...
8
1 3
4
12
2
11
N
N
iii Npk
1 2
1 ...
8
1
4
1
2
11
N
2
1
2
1 ...
8
1
4
1
1 N
Ekkor a keresés átlagos költsége:
2
Önrendező listák 2.
4
1
2
1 ...
8
1
1 N
0 2
1
1N
........
Az átlagos költség tehát: 21
N
iii pk
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
Skip lista 1.
L[1] L[2] L[3] L[4] L[5] L[6] L[7] L[8] L[9]
1. szint
2. szint
3. szint
4. szint
NNN
NNNNN
2/1...4/12/11
/...4/2/
A pointerek száma:
Többszintű, kulcs szerint rendezett láncolt lista.
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/2i elemű 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ő:
1. keressük meg az új elem helyét a listában
2. 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)
3. 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:
16
- 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.
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:
1. felosztási fázis, két részre bontás,
2. részfeladatok megoldása,
3. egyesítési fázis.
18
Quick sort 2.
19
rekurzívan
Lb Lj
<
PjPb
L1 Ln
Lk
Quick sort 3.
- 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 sort 4.
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
if a > b then csere(a,b)
if a > c then csere(a,c)
if b > c then csere(b,c)
x = b; {középső} 21
Quick sort 5.
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
top related