Copyright, 1999 © Szlávi Péter Táblázat típuskonstrukció Szlávi Péter ELTE IK Média- és Oktatásinformatikai Tanszék
Programozásmódszertan2/45 Tartalomjegyzék 0 Bevezetés 1 A táblázat algebrai specifikációja algebrai specifikációjaalgebrai specifikációja 1.1 Táblázat-műveletek Táblázat-műveletek 1.2 Táblázat-axiómák Táblázat-axiómák 2 A táblázat típuskonstrukció specifikációja típuskonstrukció specifikációjatípuskonstrukció specifikációja 2.1 A táblázat exportmodulja exportmodulja 2.2 A táblázat megvalósítási moduljai megvalósítási moduljaimegvalósítási moduljai 3 Lineáris táblázat Lineáris táblázatLineáris táblázat 4 Alkalmazás: rendezés kulcstranszformációval Alkalmazás: rendezés kulcstranszformációvalAlkalmazás: rendezés kulcstranszformációval
Programozásmódszertan3/45 00 Bevezetés Lényeg…a hatékony keresés 0 Kulcs az azonosítás alapjaKulcs 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:Cél: –„direkt” hozzáférés –„parciális” információ
Programozásmódszertan4/45 00 Bevezetés (folytatás) Lényeg… a hatékony keresés 0 MódszerSorozatféleSpeciális Hasonlítás-szám T L F s F d feltétel sikeres sikertelen T L F s F d feltétel sikeres sikertelen Lineáris keresés I I I I — N/2 N Lineáris kiválasztás I I I I a keresett N/2 — Lineáris gyakoriság sze- keresés I I I I rint rendezve (N+2)/3 N Logaritmikus keresés I N N Irendezettség [lb(N)]-1 [lb(N)]+1 Fibonacci Fibonacci keresés I N N Irendezettség [lb(N)]+1 Fibonacci Interpolációs Interpolációs keresés I N N Irendezettség lb(lb(N)) lb(N) Interpolációs T=Tömb; L=Lista; F s =Szekvenciális file; F d =Direkt file lb(x)= log 2 (x) Demo
Programozásmódszertan5/45 00 Bevezetés (folytatás) Lényeg… a hatékony keresés 0 Ötlet a cél megvalósításához:Ö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ódszertan6/45 00 Bevezetés (folytatás) Kulcstranszformációs függvény 0 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= II K II I = indexhalmaz (amellyel a reprezentációbeli a tömböt in- dexelni fogjuk). M= II I II, I ={0..M-1}, Megjegyzendő: a kulcsfüggvény kulcstranszformációs (hash) függvény! (Lásd itt.) itt
Programozásmódszertan7/45 00 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák 0 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) :Olyan függvényt találni, amely K (adott) kulcsot M indexre egyértelműen képez le (K M) : eséllyel lehet. „tele tábla” esetén (K=M) ez az esély:„tele tábla” esetén (K=M) ez az esély: 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] évfolyam- létszámmal, a 103-mal: ~0, , azaz „kémikusul mondva” 6 kilences pontossággal biztos esemény: K=103, M=365.) születésnap-paradoxonszületésnap-paradoxon M helyre K valamit ismétlés nélkül téve M helyre K valamit ismétlést is megengedve téve Prog- ram
Programozásmódszertan8/45 00 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák 0 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 ),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,é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)véletlenszerűen szórja szét (még a közel azonos) kulcsokat (is) egyenletesség, kevés ütközést produkáljon,kevés ütközést produkáljon, egyszerűen kiszámolható legyen.egyszerűen kiszámolható legyen. Lemondunk az egyértelműség mindenáron teljesítéséről.
Programozásmódszertan9/45 00 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák 0 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ódszertan10/45 00 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák 0 P 3 =P(3. elem nem ütközik 2. elemig nem volt ütközés)= =… P N =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 *...*P n = = = (M«K)
Programozásmódszertan11/45 00 Bevezetés (folytatás) Kulcstranszformációs függvény – problémák 0 P(ütközés n.-ig)=1–P 1 *P 2 *...*P n (M«K) Számoljunk, mit is jelent ez pl. M=10-ig!
Programozásmódszertan12/45 00 Bevezetés (folytatás) Kulcstranszformációs függvények definiálása 0 a) Osztó módszer a) Osztó módszer h (k):=k Mod M, k Z b) Szorzó módszer b) Szorzó módszer h (k):=Közepe m (A*k), k Z c) Számjegyes módszer d) Jel-kód módszerek
Programozásmódszertan13/45 00 Bevezetés (folytatás) Kulcsütközés feloldási módszerei 0 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ódszertan14/45 11 A táblázat algebrai specifikációja 1.1 Táblázat-műveletek 1 Típus Táblázat(Kulcs fv (Elem):Kulcs, Méret:Egész :Elem): Típus Táblázat(Kulcs fv (Elem):Kulcs, Méret:Egész : Elem): Asszociált műveletek: Üres: Táblázat Beilleszt(Táblázat,Elem): Táblázat {NemDef} Töröl(Táblázat,Kulcs): Táblázat {NemDef} Keres(Táblázat,Kulcs): Elem {NemDef} ElemSzám(Táblázat): Egész
Programozásmódszertan15/45 11 A táblázat algebrai specifikációja 1.1 Táblázat-műveletek 1 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 {NemDef} Utolsó(Táblázat): Táblázat Elem {NemDef} Következő(Táblázat): Táblázat Elem {NemDef} Előző(Táblázat): Táblázat Elem {NemDef}
Programozásmódszertan16/ Táblázat-axiómák 1.2 Axiómák: 1 o Üres táblázat minden eleme nem definiált értékű, és 0 az elemszám. ElemSzám(Üres)=0 Keres(Üres,k)=NemDef Töröl(Üres,k)=NemDef … 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) Kulcs fv (e)=Kulcs fv (e * ) Beilleszt(Beilleszt(t,e),e * )=NemDef Tele?(t) Beilleszt(t,e)=t * NemDef ElemSzám(t * )=ElemSzám(t)+1 A speciális műveleteket most nem axiomatizáljuk.
Programozásmódszertan17/ 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’ ElemSzám(t’)=ElemSzám(t)-1 Keres(t,k)=NemDef Töröl(t,k)=NemDef Keres(t,k)=NemDef Töröl(t,k)=NemDef 4 o Ha van keresett kulcsú elem a táblázatban, akkor az kikereshető. Beilleszt(t,e)=t’ Keres(t’,Kulcs fv (e))=e
Programozásmódszertan18/45 22 A táblázat típuskonstrukció specifikációja 2.1 A táblázat exportmodulja 2 ExportModul 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) Meg kell gondolni az operátorok ef/uf-ét az axiómák alapján! Lásd a deklarációs példát!példát Lásd a deklarációs példát!példát
Programozásmódszertan19/ A táblázat exportmodulja (folytatás) Függvény ElemSzám(Konstans t:Táblázat): Egész Függvény Hibás?(Konstans t:Táblázat): Logikai Eljárás ÚjraSzervez(Változó t:Táblázat) ÚjraSzervez Modul vége.
Programozásmódszertan20/45 22 A táblázat típuskonstrukció specifikációja 2.2. A táblázat megvalósítási moduljai Túlcsordulási terület módszere moduljai 2moduljai Modul Táblázat(Függvény Kulcs(TElem):TKulcs, Konstans Méret:Egész : Típus TElem): Reprezentáció Reprezentáció Konstans TúlcsMéret:Egész(?) [pl. Méret?] Típus TElemJellemző=(Üres,Foglalt,Törölt) TTáblaElem=Rekord(elem:TElem, attri:TElemJellemző) TTábla=Tömb(0..Méret-1:TTáblaElem) TTulcsTer=Tömb(0..TúlcsMéret-1:TElem) Változó ft:TTábla, tt:TTulcsTer [„fő”-, túlcsordulási tábla] db,ttdb:Egész [össz-elemszám, tt kitöltöttsége] hiba:Logikai Meggondolandó, hogy a Tábla és a TTulcsTer össz-mérete legyen Méret-nyi.
Programozásmódszertan21/ Túlcsordulási terület módszere (folytatás) Implementáció Implementáció Eljárás Beilleszt(Változó t:Táblázat, Konstans e:TElem): Beilleszt Változó k:TKulcs, kk:0..Méret-1 van:Logikai, melyik:Egész k:=Kulcs fv (e); kk:=Hash(k) Elágazás ft(kk).attri {Üres,Törölt} esetén ft(kk):=TTáblaElem(e,Foglalt); db:+1 Kulcs fv (ft(kk).elem) k esetén LineárisKeresés(tt,k,van,melyik) Ha van vagy ttdb=TulcsMéret-1 akkor hiba:=Igaz különben db:+1; tt(ttdb):=e; ttdb:+1 Elágazás vége egyébként hiba:=Igaz Elágazás vége Eljárás vége. Változó k:TKulcs, kk:0..Méret-1 van:Logikai, melyik:Egész k:=Kulcs fv (e); kk:=Hash(k) Elágazás ft(kk).attri {Üres,Törölt} esetén ft(kk):=TTáblaElem(e,Foglalt); db:+1 Kulcs fv (ft(kk).elem) k esetén LineárisKeresés(tt,k,van,melyik) Ha van vagy ttdb=TulcsMéret-1 akkor hiba:=Igaz különben db:+1; tt(ttdb):=e; ttdb:+1 Elágazás vége egyébként hiba:=Igaz Elágazás vége Eljárás vége. Szerepel-e már k-kulcsú a tt-ben L. A 2. axiómát! L. A 2. axiómát!
Programozásmódszertan22/ Túlcsordulási terület módszere (folytatás) 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 ft(kk).attri Üres akkor Ha Kulcs fv (ft(kk).elem) k akkor [a tulcs.területen] LineárisKeresés(tt,k,van,melyik) Ha van akkor ttdb:-1; tt(melyik):=tt(ttdb); db:-1 különben hiba:=Igaz különben [a főtáblában] ft(kk).attri:=Törölt; db:-1 Elágazás vége különben [nem létező elem nem törölhető] hiba:=Igaz Elágazás vége Eljárás vége. L. A 3. axiómát! L. A 3. axiómát!
Programozásmódszertan23/ Túlcsordulási terület módszere (folytatás) 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; te:TTablaElem kk:=Hash(k); te:=ft(kk) Elágazás te.attri=Üres vagy te.attri=Törölt és Kulcs fv (te.elem)=k esetén hiba:=Igaz [ nem létező elem nem törölhető! ] Kulcs fv (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árisKeresé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. L. A 3. axiómát! L. A 3. axiómát!
Programozásmódszertan24/ 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): 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 Kulcs fv (ft(kk).elem)=k esetén van:=ft(kk).attri=Foglalt Ha van akkor e:=ft(kk).elem egyéb esetben LineárisKeresé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.... L. a 4. axiómát! L. a 4. axiómát!
Programozásmódszertan25/ A táblázat megvalósítási moduljai Láncolt altáblák módszere moduljai Modul Táblázat(Függvény Kulcs(TElem):TKulcs, Konstans Méret:Egész : Típus TElem): Reprezentáció 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ódszertan26/ Láncolt altáblák módszere (folytatás) Implementáció Implementáció Eljárás Beilleszt(Változó t:Táblázat, Konstans e:TElem): Változó kk:0..Méret-1 van:Logikai kk:=Hash(Kulcs fv (e)); van:=Eldöntés(tab(kk),Kulcs fv (e)) Ha van akkor hiba:=Igaz különben db:+1; BeszúrMögé(tab(kk),e) Eljárás vége. Beilleszt Eljárás Töröl(Változó t:Táblázat, Konstans k:TKulcs): Változó kk:0..Méret-1 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. Van-e már k-kulcsú a tab(kk)-ban L. A 2. axiómát! L. A 2. axiómát! L. A 3. axiómát! L. A 3. axiómát!
Programozásmódszertan27/ Láncolt altáblák módszere (folytatás) 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 Kulcs fv (ElemÉrték(tab(kk))) k Következőre(tab(kk)) Ciklus vége Ha Kulcs fv (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. … L. a 4. axiómát! L. a 4. axiómát!
Programozásmódszertan28/ A táblázat megvalósítási moduljai Lineárisan szétszórt altáblák módszere moduljai Modul Táblázat(…): … Reprezentáció Reprezentáció Típus TElemJellemző=(Üres,Foglalt,Törölt) TTáblaElem=Rekord(elem:TElem, attri:TElemJellemző) TTábla=Tömb(0..Méret-1:TTáblaElem) Változó tab:TTábla hiba:Logikai db:Egész [ az elemek száma ] 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:=Kulcs Fv (e); kk:=Hash(k) Beilleszt L. A 2. axiómát! L. A 2. axiómát!
Programozásmódszertan29/ Lineárisan szétszórt altáblák módszere Ha tab(kk).attri=Üres akkor tab(kk):=TáblaElem(e,Foglalt); db:+1 különbenLineárisKeresés(tab,kk,k,van,melyik) Ha van és tab(melyik).attri=Foglalt akkor hiba:=Igaz különben HelyKeresés(tab,kk,van,melyik) Ha van akkor tab(melyik):=TáblaElem(e,Foglalt) db:+1 különben hiba:=igaz Elágazás vége Elágazás vége Elágazás vége Eljárás vége. Ha tab(kk).attri=Üres akkor tab(kk):=TáblaElem(e,Foglalt); db:+1 különbenLineárisKeresés(tab,kk,k,van,melyik) Ha van és tab(melyik).attri=Foglalt akkor hiba:=Igaz különben HelyKeresés(tab,kk,van,melyik) Ha van akkor tab(melyik):=TáblaElem(e,Foglalt) db:+1 különben hiba:=igaz Elágazás vége Elágazás vége Elágazás vége Eljárás vége. Egy k-kulcsú keresése kk-tól ciklikusan Üres-ig. Üres vagy Törölt keresése kk-tól ciklikusan.
Programozásmódszertan30/ Lineárisan szétszórt altáblák módszere 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 különben LineárisKeresé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. Egy k-kulcsú keresése kk-tól ciklikusan Üres-ig. L. A 3. axiómát! L. A 3. axiómát!
Programozásmódszertan31/ Lineárisan szétszórt altáblák módszere 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 kk:=Hash(k) Ha tab(kk).attri=Üres akkor van:=Hamis különben LineárisKeresé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.... Egy k-kulcsú keresése kk-tól ciklikusan Üres-ig. L. a 4. axiómát! L. a 4. axiómát!
Programozásmódszertan32/45 33 Lineáris táblázat 3.1 Algebrai specifikáció (részlet) 3 Kiegészítő műveletek: Első(Táblázat): Táblázat TElem {NemDef} Utolsó(Táblázat): Táblázat TElem {NemDef} Előző(Táblázat): Táblázat TElem {NemDef} Következő(Táblázat): Táblázat TElem {NemDef} Axiómák:... hf.
Programozásmódszertan33/45 33 Lineáris táblázat 3.2 Exportmodul (részlet) 3 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ódszertan34/45 44 Alkalmazás: rendezés kulcstranszformációval 4 A rendező algoritmusok többsége (így pl. a beillesztéses is) kedvező hasonlítás-/mozgatás-számmal képes ren- dezni a „majdnem rendezett” sorozatokat. Alkalmas (=rendezéstartó) kulcstranszformációs-függ- vé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: Kulcs fv (x):=x, azaz identikus függvény (Id:TElem 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ódszertan35/45 44 Rendezés kulcstranszformációval (folytatás) 4 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. lineárisan szétszórt altábláklineárisan szétszórt altáblák 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)) 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. Ennyi elem van már a helyén X-ben.
Programozásmódszertan36/45 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 rende- zést megvalósítani (tehát a reprezentációt ismeretlennek feltéve). 44 Rendezés kulcstranszformációval (folytatás) 4
Programozásmódszertan37/45 44 Rendezés kulcstranszformációval (folytatás) 4 Helyremozgatások száma többlethely/elemszámN=1000 elemN=2000 elem többlethely/elemszámN=1000 elemN=2000 elem +0% 21.8*N 36.5*N +25% 3.47*N 2.94*N +50% 1.74*N 1.08*N +75% 1.38*N 0.92*N +100% 1.02*N 0.76*N
Programozásmódszertan38/45 Megjegyzés – Fibonacci keresés Lényegében logaritmikus keresés, de nem felezi az intervallumot, hanem aranymetszi, azaz mivel a vizsgált intervallum mindig Fibonacci szám hosszúságú, ezért ezt fölbontja két, egymást kö- vető Fibonacci szám hosszúságú részintervallum- ra, s ezek egyikében folytatja a keresést. A na- gyobb hatékonyság elsősorban annak köszönhető, hogy az intervallumosztást kivonással, s nem osztással végzi el.
Programozásmódszertan39/45 Megjegyzés – Interpolációs keresés Alapötlete ennek is a részekre osztás, de sem nem közé- pen, sem nem aranymetszéssel, hanem a keresett elem tartalma alapján várható helyen. Az [A..F] intervallum osztópontja a k keresési kulcs esetén: Alapötlete ennek is a részekre osztás, de sem nem közé- pen, sem nem aranymetszéssel, hanem a keresett elem tartalma alapján várható helyen. Az [A..F] intervallum osztópontja a k keresési kulcs esetén: Ez csak aszimptotikusan igaz, sőt a bonyolultabb szá- mítás is csökkenti a hatékonyságot. Világos, hogy a kulcs szám kell legyen, azaz k,k A,k F :Egész
Programozásmódszertan40/45 Megjegyzés – Újraszervez Ennek a tisztán technikai jellegű eljárásnak csak bizonyos ábrázolás esetén lesz értelme. Célja racionálisabbá szervezni a táblázatot (rövidíteni a keresési időt).
Programozásmódszertan41/45 Megjegyzés – Kulcs és Kulcstranszformációs függvény Elemek halmaza Kulcsok halmaza Indexek halmaza Kulcs Hash
Programozásmódszertan42/45 Megjegyzés – Táblázatdeklarációs példa Típus TNév=…, TCím=… TElem=Rekord(név:TNév,lakcím:TCím,…) TKulcsFv=Függvény(TElem):TNév Függvény Neve(Konstans e:TElem):TNév Neve:=e.név Függvény vége. Típus TNyilvTart=Táblázat(Neve,1000:TElem) Változó nyt:TNyilvTart
Programozásmódszertan43/45 Megjegyzés – Túlcsordulási terület tt: 0e’ … …… TúlcsMéret-1… ft:elemattri 0 …eFoglalt Méret-1--Üres Hash(Kulcs(e”)) ttDb ttDb e”
Programozásmódszertan44/45 Megjegyzés – Láncolt altáblák tab: 0 … Méret-1 Hash(Kulcs(e”)) ee’e” Kulcs(e) Kulcs(e’) Hash(Kulcs(e))=Hash(Kulcs(e’)) Kulcs(e) Kulcs(e”) Kulcs(e’) Kulcs(e”) Hash(Kulcs(e))=Hash(Kulcs(e’))=Hash(Kulcs(e”))
Programozásmódszertan45/45 Megjegyzés – Lineárisan szétszórt altáblák Hash(Kulcs(e”)) ……… …– nem Foglalt … Méret-1…… tab:elemattri 0 …eFoglalt …e’Foglalt
Programozásmódszertan46/45 Megjegyzés – Lineárisan szétszórt altáblák ……… …e”Foglalt … Méret-1…… Hash(Kulcs(e”)) tab:elemattri 0 …eFoglalt …e’Foglalt