Tblzat tpuskonstrukci Szlvi Pter ELTE IK Mdia s
Táblázat típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék szlavip@elte. hu http: //people. inf. elte. hu/szlavi/ Copyright, 1999 © Szlávi Péter
Tartalomjegyzék 0 Bevezetés 1 A táblázat algebrai specifikációja 1. 1 Táblázat-műveletek 1. 2 Táblázat-axiómák 2 A táblázat típuskonstrukció specifikációja 2. 1 A táblázat exportmodulja 2. 2 A táblázat megvalósítási moduljai 3 Lineáris táblázat 4 Alkalmazás: rendezés kulcstranszformációval Programozásmódszertan 2/45 99. 03. 04.
0 Bevezetés Lényeg…a hatékony keresés • Kulcs az azonosítás alapja Keresések – adatszerkezetek – „Totális” információ – Halmaz „direkt” hozzáférés Van-e? – „Parciális” információ – Sorozatfélék „szekvenciális” hozzáférés Van-e? / Melyik az? „Totális” információ • Cél: – „direkt” hozzáférés – „parciális” információ Programozásmódszertan 3/45 99. 03. 04.
0 Bevezetés (folytatás) Lényeg… a hatékony keresés Módszer Sorozatféle T L F s Fd Speciális feltétel Demo Hasonlítás-szám sikeres sikertelen Lineáris keresés I I — N/2 N Lineáris kiválasztás I I a keresett N/2 — Lineáris gyakoriság szekeresés I I rint rendezve (N+2)/3 N Logaritmikus keresés I N N I rendezettség [lb(N)]-1 [lb(N)]+1 Fibonacci keresés I N N I rendezettség <[lb(N)]-1 >[lb(N)]+1 Interpolációs keresés I N N I rendezettség lb(lb(N)) lb(N) T=Tömb; L=Lista; Fs =Szekvenciális file; Fd=Direkt file lb(x)= log 2(x) Programozásmódszertan 4/45 99. 03. 04.
0 Bevezetés (folytatás) Lényeg… a hatékony keresés • Ötlet a cél megvalósításához: – Reprezentáció = „direkt-címezhető”, indexelhető struktúra (pl. tömb, direktfile) – Implementáció = alkalmas „Kulcs Index” függvény Programozásmódszertan 5/45 99. 03. 04.
0 Bevezetés (folytatás) Kulcstranszformációs függvény Kulcstranszformációs (index- / hash- / „hasító”) függvény: h: K I, ahol K = kulcshalmaz (ahova képez a kulcsfüggvény, ami az egyes elemekhez hozzárendeli azt az információt, a kulcsot, amely alapján kikereshető a táblázatból). K=IIKII I = indexhalmaz (amellyel a reprezentációbeli a tömböt in- dexelni fogjuk). M=IIIII, I={0. . M-1}, Megjegyzendő: a kulcsfüggvény kulcstranszformációs (hash) függvény! (Lásd itt. ) Programozásmódszertan 6/45 99. 03. 04.
0 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák 1. Az egyértelműség és ára: • Olyan függvényt találni, amely K (adott) kulcsot M indexre egyértelműen képez le (K M) : M helyre K valamit ismétlés nélkül téve eséllyel lehet. • „tele tábla” esetén (K=M) ez az esély: M helyre K valamit ismétlést is megengedve téve Pl. születésnap-paradoxon: ha 23 ember összegyűlik ünnepelni, akkor ~0, 5073 annak a sansza, hogy lesz közöttük legalább kettő, aki azonos napon született. (Az aktuális [1999 -ben] évfolyamlétszámmal, a 103 -mal: ~0, 999 884, azaz „kémikusul mondva” 6 kilences pontossággal biztos esemény: K=103, M=365. ) Programozásmódszertan 7/45 Program 99. 03. 04.
0 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák Az elvárások gyengítése a kulcstranszformációs függvénnyel szemben: • legyen K a lehetséges kulcsok halmaza (eddig a ténylegesen előfordultakat jelöltük így), • értékkészlete a teljes I={0. . M– 1} halmaz, • véletlenszerűen szórja szét (még a közel azonos) kulcsokat (is) egyenletesség, • kevés ütközést produkáljon, • egyszerűen kiszámolható legyen. Lemondunk az egyértelműség mindenáron teljesítéséről. Programozásmódszertan 8/45 99. 03. 04.
0 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák 2. A nem egyértelműség következménye: a kulcsütközés Mi az esélye (véletlenszerű választás esetén) a „jó” hely választásnak az i. alkalommal? Ha K M, akkor (egyenletesség esetén pontosan, egyébként átlagosan) K/M „szinonima” (=az ugyanoda leképezett kulcsok egymás szinonimái). P 1=P(1. elem nem ütközik)=1 P 2=P(2. elem nem ütközik 1. elemig nem volt ütközés)= = … Programozásmódszertan 9/45 99. 03. 04.
0 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák P 3=P(3. elem nem ütközik 2. elemig nem volt ütközés)= = … PN=P(N. elem nem ütközik N-1. elemig nem volt ütközés)= = P(ütközés n. -ig)=1–P 1*P 2*. . . *Pn= = = Programozásmódszertan 10/45 (M «K) 99. 03. 04.
0 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák P(ütközés n. -ig)=1–P 1*P 2*. . . *Pn (M «K) Számoljunk, mit is jelent ez pl. M=10 -ig! Programozásmódszertan 11/45 99. 03. 04.
0 Bevezetés (folytatás) Kulcstranszformációs függvények definiálása a) Osztó módszer h(k): =k Mod M, k Z b) Szorzó módszer h(k): =Közepem(A*k), k Z c) Számjegyes módszer d) Jel-kód módszerek Programozásmódszertan 12/45 99. 03. 04.
0 Bevezetés (folytatás) Kulcsütközés feloldási módszerei a) Túlcsordulási terület módszere b) Láncolt altáblák módszere c) Lineárisan szétszórt altáblák vagy nyílt címzés módszer d) Másodlagos kulccsal, más néven kettős hash-eléssel e) Hierarchikus módszer f) Blokkolt altáblák, láncolt blokkokkal Programozásmódszertan 13/45 99. 03. 04.
1 A táblázat algebrai specifikációja 1. 1 Táblázat-műveletek Típus Táblázat(Kulcsfv(Elem): Kulcs, Méret: Egész : Elem): Asszociált műveletek: Üres: Táblázat Beilleszt(Táblázat, Elem): Táblázat {Nem. Def} Töröl(Táblázat, Kulcs): Táblázat {Nem. Def} Keres(Táblázat, Kulcs): Elem {Nem. Def} Elem. Szám(Táblázat): Egész Programozásmódszertan 14/45 99. 03. 04.
1 A táblázat algebrai specifikációja 1. 1 Táblázat-műveletek További lehetséges táblázatművelet: Tele? (Táblázat): Logikai A bejáráshoz (lineáris táblázat): Első(Táblázat): Táblázat Elem {Nem. Def} Utolsó(Táblázat): Táblázat Elem {Nem. Def} Következő(Táblázat): Táblázat Elem {Nem. Def} Előző(Táblázat): Táblázat Elem {Nem. Def} Programozásmódszertan 15/45 99. 03. 04.
A speciális műveleteket most nem axiomatizáljuk. 1. 2 Táblázat-axiómák Axiómák: 1 o Üres táblázat minden eleme nem definiált értékű, és 0 az elemszám. Elem. Szám(Üres)=0 Keres(Üres, k)=Nem. Def Töröl(Üres, k)=Nem. Def … 2 o Ha van még hely, akkor elem beszúrható és az elemszám eggyel nő, kivéve, ha ugyanilyen kulcsút már tartalmaz a táblázat. Tele? (t) Kulcsfv(e)=Kulcsfv(e*) Beilleszt(t, e), e*)=Nem. Def Tele? (t) Beilleszt(t, e)=t* Nem. Def Elem. Szám(t*)=Elem. Szám(t)+1 Programozásmódszertan 16/45 99. 03. 04.
1. 2 Táblázat-axiómák (folytatás) 3 o Létező elem törölhető, és az elemszám eggyel csökken; nem létező törlése nem definiált. Keres(t, k)=e Töröl(t, k)=t’ Elem. Szám(t’)=Elem. Szám(t)-1 Keres(t, k)=Nem. Def Töröl(t, k)=Nem. Def 4 o Ha van keresett kulcsú elem a táblázatban, akkor az kikereshető. Beilleszt(t, e)=t’ Keres(t’, Kulcsfv(e))=e Programozásmódszertan 17/45 99. 03. 04.
2 A táblázat típuskonstrukció Meg kell gondolni az specifikációja operátorok ef/uf-ét az 2. 1 A táblázat exportmodulja axiómák alapján! Export. Modul Táblázat(Függvény Kulcs(TElem): TKulcs, Konstans Méret: Egész : Típus TElem): Eljárás Üres(Változó t: Táblázat) Eljárás Beilleszt(Változó t: Táblázat, Konstans e: TElem) Eljárás Töröl(Változó t: Táblázat, Konstans k: TKulcs) Eljárás Keres(Változó t: Táblázat, Konstans k: TKulcs, Változó e: TElem) Lásd a deklarációs példát! Programozásmódszertan 18/45 99. 03. 04.
2. 1 A táblázat exportmodulja (folytatás) Függvény Elem. Szám(Konstans t: Táblázat): Egész Függvény Hibás? (Konstans t: Táblázat): Logikai Eljárás Újra. Szervez(Változó t: Táblázat) Modul vége. Programozásmódszertan 19/45 99. 03. 04.
2 A táblázat típuskonstrukció specifikációja 2. 2. A táblázat megvalósítási moduljai 2. 2. 1 Túlcsordulási terület módszere Modul Táblázat(Függvény Kulcs(TElem): TKulcs, Konstans Méret: Egész : Típus TElem): Meggondolandó, hogy a Tábla Reprezentáció és a TTulcs. Ter össz-mérete legyen Méret-nyi. Konstans Túlcs. Méret: Egész(? ) [pl. Méret? ] Típus TElem. Jellemző=(Üres, Foglalt, Törölt) TTábla. Elem=Rekord(elem: TElem, attri: TElem. Jellemző) TTábla=Tömb(0. . Méret-1: TTábla. Elem) TTulcs. Ter=Tömb(0. . Túlcs. Méret-1: TElem) Változó ft: TTábla, tt: TTulcs. Ter [„fő”-, túlcsordulási tábla] db, ttdb: Egész [össz-elemszám, tt kitöltöttsége] hiba: Logikai Programozásmódszertan 20/45 99. 03. 04.
2. 2. 1 Túlcsordulási terület módszere (folytatás) L. A 2. axiómát! Implementáció Eljárás Beilleszt(Változó t: Táblázat, Konstans e: TElem): Változó k: TKulcs, kk: 0. . Méret-1 van: Logikai, melyik: Egész k: =Kulcsfv(e); kk: =Hash(k) Elágazás ft(kk). attri {Üres, Törölt} esetén ft(kk): =TTábla. Elem(e, Foglalt); db: +1 Kulcsfv(ft(kk). elem) k esetén Lineáris. Keresés(tt, k, van, melyik) Ha van vagy ttdb=Tulcs. Méret-1 akkor hiba: =Igaz különben db: +1; tt(ttdb): =e; ttdb: +1 Elágazás vége Szerepel-e már k-kulcsú a tt-ben egyébként hiba: =Igaz Elágazás vége Eljárás vége. Programozásmódszertan 21/45 99. 03. 04.
2. 2. 1 Túlcsordulási terület módszere (folytatás) Eljárás Töröl(Változó t: Táblázat, Konstans k: TKulcs): L. A 3. axiómát! Változó kk: 0. . Méret-1 van: Logikai, melyik: Egész; te: TTabla. Elem kk: =Hash(k); te: =ft(kk) Elágazás te. attri=Üres vagy te. attri=Törölt és Kulcsfv(te. elem)=k esetén hiba: =Igaz [nem létező elem nem törölhető!] Kulcsfv(te. elem)=k esetén [főtáblából törölhető] ft(kk). attri: =Törölt; db: -1 egyéb esetben [tán a túlcsordulási területen? ] Lineáris. Keresés(tt, k, van, melyik) Ha van akkor ttdb: -1; tt(melyik): =tt(ttdb); db: -1 különben hiba: =Igaz Elágazás vége Eljárás vége. Programozásmódszertan 23/45 99. 03. 04.
2. 2. 1 Túlcsordulási terület módszere (folytatás) Eljárás Keres(Változó t: Táblázat, Konstans k: TKulcs Változó e: TElem): L. a 4. axiómát! Változó kk: 0. . Méret-1 melyik: Egész van: Logikai kk: =Hash(k) Elágazás ft(kk). attri=Üres esetén van: =Hamis Kulcsfv(ft(kk). elem)=k esetén van: =ft(kk). attri=Foglalt Ha van akkor e: =ft(kk). elem egyéb esetben Lineáris. Keresés(tt, k, van, melyik) Ha van akkor e: =tt(melyik) Elágazás vége Ha nem van akkor hiba: =Igaz Eljárás vége. . Programozásmódszertan 24/45 99. 03. 04.
2. 2. A táblázat megvalósítási moduljai 2. 2. 2 Láncolt altáblák módszere Modul Táblázat(Függvény Kulcs(TElem): TKulcs, Konstans Méret: Egész : Típus TElem): Reprezentáció Típus TTábla=Tömb(0. . Méret-1: Lista(TElem) [láncolt lista]) Változó tab: TTábla hiba: Logikai db: Egész [az elemek száma] Programozásmódszertan 25/45 99. 03. 04.
2. 2. 2 Láncolt altáblák módszere (folytatás) Implementáció L. A 2. axiómát! Eljárás Beilleszt(Változó t: Táblázat, Konstans e: TElem): Változó kk: 0. . Méret-1 Van-e már k-kulcsú a tab(kk)-ban van: Logikai kk: =Hash(Kulcsfv(e)); van: =Eldöntés(tab(kk), Kulcsfv(e)) Ha van akkor hiba: =Igaz különben db: +1; Beszúr. Mögé(tab(kk), e) Eljárás vége. Eljárás Töröl(Változó t: Táblázat, Konstans k: TKulcs): Változó kk: 0. . Méret-1 L. A 3. axiómát! van: Logikai kk: =Hash(k) van: =Eldöntés(tab(kk), k) Ha van akkor db: -1; Kihagy(tab(kk)) különben hiba: =Igaz Eljárás vége. Programozásmódszertan 26/45 99. 03. 04.
2. 2. 2 Láncolt altáblák módszere (folytatás) L. a 4. axiómát! Eljárás Keres(Változó t: Táblázat, Konstans k: TKulcs Változó e: TElem): Változó kk: 0. . Méret-1; van: Logikai kk: =Hash(k); van: =Hamis Ha nem Üres? (tab(kk)) akkor Elsőre(tab(kk)) Ciklus amíg nem UtolsóE? (tab(kk)) és Kulcsfv(ElemÉrték(tab(kk))) k Következőre(tab(kk)) Ciklus vége Ha Kulcsfv(ElemÉrték(tab(kk)))=k akkor e: =ElemÉrték(tab(kk)); van: =Igaz Elágazás vége Ha nem van akkor hiba: =Igaz Eljárás vége. … Programozásmódszertan 27/45 99. 03. 04.
2. 2. A táblázat megvalósítási moduljai 2. 2. 3 Lineárisan szétszórt altáblák módszere Modul Táblázat(…): Reprezentáció Típus TElem. Jellemző=(Üres, Foglalt, Törölt) TTábla. Elem=Rekord(elem: TElem, attri: TElem. Jellemző) TTábla=Tömb(0. . Méret-1: TTábla. Elem) Változó tab: TTábla hiba: Logikai db: Egész [az elemek száma] Implementáció L. A 2. axiómát! Eljárás Beilleszt(Változó t: Táblázat, Konstans e: TElem): Változó k: TKulcs, kk: 0. . Méret-1 van: Logikai, melyik: Egész k: =Kulcs. Fv(e); kk: =Hash(k) Programozásmódszertan 28/45 99. 03. 04.
2. 2. 3 Lineárisan szétszórt altáblák módszere Egy k-kulcsú keresése kk-tól ciklikusan Üres-ig. Ha tab(kk). attri=Üres akkor tab(kk): =Tábla. Elem(e, Foglalt); db: +1 különben Lineáris. Keresés(tab, kk, k, van, melyik) Ha van és tab(melyik). attri=Foglalt akkor hiba: =Igaz különben Hely. Keresés(tab, kk, van, melyik) Ha van akkor tab(melyik): =Tábla. Elem(e, Foglalt) db: +1 különben hiba: =igaz Elágazás vége Eljárás vége. Üres vagy Törölt keresése kk-tól ciklikusan. Programozásmódszertan 29/45 99. 03. 04.
2. 2. 3 Lineárisan szétszórt altáblák módszere L. A 3. axiómát! Eljárás Töröl(Változó t: Táblázat, Konstans k: TKulcs): Változó kk: 0. . Méret-1 van: Logikai, melyik: Egész kk: =Hash(k) Ha tab(kk). attri=Üres akkor hiba: =Igaz Egy k-kulcsú keresése kk-tól ciklikusan Üres-ig. különben Lineáris. Keresés(tab, kk, k, van, melyik) Ha van és tab(melyik). attri=Foglalt akkor tab(melyik). attri: =Törölt; db: -1 különben hiba: =Igaz Elágazás vége Eljárás vége. Programozásmódszertan 30/45 99. 03. 04.
2. 2. 3 Lineárisan szétszórt altáblák módszere L. a 4. axiómát! Eljárás Keres(Változó t: Táblázat, Konstans k: TKulcs Változó e: TElem): Változó kk: 0. . Méret-1 melyik: Egész van: Logikai Egy k-kulcsú keresése kk-tól ciklikusan Üres-ig. kk: =Hash(k) Ha tab(kk). attri=Üres akkor van: =Hamis különben Lineáris. Keresés(tab, kk, k, van, melyik) Ha van és tab(melyik). attri=Foglalt akkor e: =tab(melyik). elem különben van: =Hamis [ha nincs, v. Törölt] Elágazás vége Ha nem van akkor hiba: =Igaz Eljárás vége. . Programozásmódszertan 31/45 99. 03. 04.
3 Lineáris táblázat 3. 1 Algebrai specifikáció (részlet) Kiegészítő műveletek: Első(Táblázat): Táblázat TElem {Nem. Def} Utolsó(Táblázat): Táblázat TElem {Nem. Def} Előző(Táblázat): Táblázat TElem {Nem. Def} Következő(Táblázat): Táblázat TElem {Nem. Def} Axiómák: . . . hf. Programozásmódszertan 32/45 99. 03. 04.
3 Lineáris táblázat 3. 2 Exportmodul (részlet) Függvény Első(Változó t: Táblázat): TElem [A tábla első elemét adja, ha üres, akkor sikertelen. ] Függvény Utolsó(Változó t: Táblázat): TElem [A tábla utolsó elemét adja, ha üres, akkor sikertelen. ] Függvény Előző(Változó t: Táblázat): TElem [Szekvenciálisan az aktuálisat megelőző elemet adja, ha nincs ilyen, akkor sikertelen. ] Függvény Következő(Változó t: Táblázat): TElem [Szekvenciálisan az aktuálisat követő elemet adja, ha nincs ilyen, akkor sikertelen. ]. . . hf: ef/uf és a modulja Programozásmódszertan 33/45 99. 03. 04.
4 Alkalmazás: rendezés kulcstranszformációval A rendező algoritmusok többsége (így pl. a beillesztéses is) kedvező hasonlítás-/mozgatás-számmal képes rendezni a „majdnem rendezett” sorozatokat. Alkalmas (=rendezéstartó) kulcstranszformációs-függvénnyel elérhető, hogy a nem túl speciális eloszlású elemeket tartalmazó rendezendő sorozat elemeit a körülbelüli rendezett helyére illessze. rendezendő sorozat: X: Tömb(1. . N: TElem) Kulcsfüggvény: Kulcsfv(x): =x, azaz identikus függvény (Id: TElem TKulcs=TElem ) Kulcstranszformációs függvény (h): k 1, k 2: TKulcs: k 1<k 2 h(k 1) h(k 2) „közbülső” táblázat: t: Táblázat(Id, Méret: TElem) Programozásmódszertan 34/45 99. 03. 04.
4 Rendezés kulcstranszformációval (folytatás) Kihasználjuk, hogy ismert (lineárisan szétszórt altáblák) a táblázat ábrázolása, és a h rendezéstartó voltát. Típus TRendezendő=Tömb(1. . N: TElem) Eljárás Rendezés(Változó X: TRendezendő): Változó t: Táblázat(Id, Méret: TElem); db: Egész Üres(t) Ciklus i=1 -től N-ig Beilleszt(t, X(i)) Ennyi elem van már a helyén X-ben. Ciklus vége db: =0 Ciklus i=0 -tól Méret-1 -ig Ha t. tab(i). attri=Foglalt akkor Helyére(X, db, t. tab(i). elem); db: +1 Ciklus vége Eljárás vége. Programozásmódszertan 35/45 99. 03. 04.
4 Rendezés kulcstranszformációval (folytatás) Eljárás Helyére(Változó X: TRendezendő, db: Egész, Konstans elem: TElem): Változó j: Egész j: =db Ciklus amíg j>0 és X(j)>elem X(j+1): =X(j); j: -1 Ciklus vége X(j+1): =elem Eljárás vége. Hf meggondolni: lineáris táblázattal hogyan lehet a rendezést megvalósítani (tehát a reprezentációt ismeretlennek feltéve). Programozásmódszertan 36/45 99. 03. 04.
4 Rendezés kulcstranszformációval (folytatás) Helyremozgatások száma többlethely/elemszám +0% +25% +50% +75% +100% Programozásmódszertan N=1000 elem N=2000 elem 21. 8*N 3. 47*N 1. 74*N 1. 38*N 1. 02*N 36. 5*N 2. 94*N 1. 08*N 0. 92*N 0. 76*N 37/45 99. 03. 04.
- Slides: 36