390 likes | 513 Views
Kulcstranszformációs táblázat. Ennek a táblázatnak az ábrázolása folytonos. Soros táblázat esetén egy elem helyét a beszúrás időpontja, önátrendező táblázat nál a feldolgozás gyakorisága, rendezett táblázat nál a kulcs értéke szabja meg.
E N D
Kulcstranszformációs táblázat • Ennek a táblázatnak az ábrázolása folytonos. • Soros táblázat esetén egy elem helyét a beszúrás időpontja, • önátrendező táblázatnál a feldolgozás gyakorisága, • rendezett táblázatnál a kulcs értéke szabja meg. • Kulcstranszformációs táblázat esetén egy elem helyét a k kulcs valamilyen f(k)-val jelölt függvénye alapján határozhatjuk meg. • Ezt a függvényt hívjuk hasító vagy hash függvénynek. • Az eljárást magát (elem kulcsához meghatározzuk az f(k) értéket) hashingnak vagy randomizálásnak vagy kulcstranszformációnak vagy hasításnak nevezzük.
Kulcs transzformációs táblázat • A hash-függvény a kulcsokat képezi le tárbeli címekre. • Kulcstranszformáció esetén beszélünk a kulcsok elvi előfordulási lehetőségeiről, és a gyakorlatban ténylegesen megvalósuló kulcsértékekről. • A hash-függvény lehet kölcsönösen egyértelmű (ideális eset). • Ez akkor valósítható meg, ha az elvi és a gyakorlati lehetőségek száma közel megegyezik, vagy a gyakorlatban előforduló kulcsok egyenletesen oszlanak el az elvi lehetőségen belül. (Ideális eset, csak ritkán fordul elő) • Ha az elvi és a gyakorlati lehetőségek között nagy a különbség és nem egyenletes az eloszlás, akkor csak egyértelmű hash függvények léteznek.
Kulcs transzformációs táblázat • Egy-egy hash-függvénytől a következő dolgokat várjuk el: • helyezze le a kulcsokat a rendelkezésre álló címtartományra; • ezen a címtartományon próbálja meg egyenletessé tenni az eloszlást • Általában elmondhatjuk, hogy univerzális hash-függvény, ami ezeket garantája, nincs. • A legtöbb esetben előfordul, hogy különböző kulcsokhoz ugyanazt a címet rendeli. Ekkor szinonimákról beszélünk. • A szinonimák felbukkanását valahogy kezelni kell, mert egy helyen a tartományban csak egy elemet tudok elhelyezni.
Kulcstranszformációs módszerek • A kulcstranszformációs módszerek azt mondják meg, hogy a hash-függvény milyen algoritmussal helyezi le a kulcsot a tartománybeli címre. • Különböző módszerek a kulcsok egyes típusaira: • Szöveges kulcsok: • a hash-függvények veszik a kulcsot alkotó karakterlánc belső kódját, • az így kapott numerikus értékeken pedig valamilyen transzformációt hajtanak végre. • Numerikus kulcsok
Numerikus kulcsok • Feltételezzük, hogy a kulcstranszformációs táblázat kulcsainak száma legnagyobb várható száma „n”. (Ennyi elemnek foglalunk helyet.) • Ennél általában nagyságrendekkel (100x, 1000x, …) nagyobb az elméletben előfordulható kulcsok száma. • Prímszámmal való osztás módszere: • A HASH függvény minden új KULCS értéket eloszt azon p prímszámmal, amely a legnagyobb, az n-nél kisebb prímek között. • Az elem helyét (sorszámot) a maradék fogja adni. Ebben az esetben 0 és p-1 közötti egész szám lesz. (Ha a tárhelyeket 1-től sorszámozzuk, ezt az értéket még 1-el megnöveljük) • Ez a módszer elég jól véletlenszerűsít (egyenletesít) és egyszerű.
Numerikus kulcsok • Szorzás módszere: Többféleképpen is megvalósítható. Az eredeti kulcsot minden esetben szoroznunk kell. Elképzelhető, hogy • egy prímszámmal, • vagy önmagával, • vagy a kulcsot valamely két számjegye között félbevágjuk, és a két felét összeszorozzuk. A megkapott szorzatnak vesszük annyi számjegyét (k), ahány jegyű n (a tárhelyek száma), és az ebből képzett számot tekintjük az elem táblázatbeli sorszámának. Általában a szorzat középső k db számjegye szokott lenni a Hash-függvény értéke. Ez a módszer is elég jól véletlenszerűsít. (Viszont nem annyira egyszerű.)
Numerikus kulcsok • Helyiérték kiválasztásos módszer: • A kapott numerikus kulcs számjegyei közül véletlenszerűen kiválasztunk k db helyiértéket, és minden kulcsból az ezen a helyiértékeken szereplő mennyiségeket kiválasztva kapjuk az elem sorszámát. • Bázistranszformáció módszere: • Ebben az esetben a kapott kulcsot úgy tekintjük, mint egy tizesnél magasabb alapú számrendszerben felírt számot. Ezt a számot áttranszformáljuk (visszatranszformáljuk) tizes számrendszerbeli számmá, és az így kapott számnak k db számjegyéből képzett számot tekintjük az elem sorszámaként.
Kulcstranszformációs módszerek • Ha sikerült Hash-függvényt választanunk, akkor a táblázat létrehozásakor, ill. bővítése idején felmerülhet a következő probléma: • A Hash-függvény időnként több érkező elemhez, ugyanazt a tárcímet (sorszámot) rendeli hozzá. • Ekkor szinonimák előfordulásáról, ill. túlcsordulásról beszélünk. • Mit tegyünk ilyenkor? • Három módszer van a szinonima kezelésre: • A nyílt címzés módszere • Láncolással történő nyílt címzés módszere • Független túlcsordulási lista alkalmazása
A nyílt címzés módszere • A nem túlcsordult és a túlcsordult elemeket ugyanazon tárhely sorozatban kell elhelyezni.(Folytonos tárolás) • Ha valahol túlcsordulást tapasztalunk, akkor • az adott helyről elindulunk a tárhelyek vége felé, • és keressük az első üres tárhelyet, • ahová bepakoljuk a túlcsordult elemet. • Amennyiben elérjük a tár végét akkor az üres hely keresését az 1. tárhelytől kezdve folytatjuk tovább.
A nyílt címzés módszere • Egy adatelemet kulcs alapján visszakeresni ezután a Hash-függvény segítségével úgy lehet, hogy ha az adott kulcsú elem nincs a Hash-függvény által adott címen (tárhelyen), akkor • egy teljes keresést kell végrehajtani az 1. üres helyig, • vagy amíg meg nem találjuk a keresett elemet. • Ha a keresés közben elérjük a tartomány végét (utolsó tárhelyét), akkor a keresést a tárhely elején folytatjuk tovább. • A keresést megállíthatja még az is, hogy anélkül érünk vissza a kiinduló helyzethez, hogy a keresett elemet megtaláltuk volna.
A nyílt címzés módszere • A kulcstranszformációs táblázatnál nyílt címzés módszerével problémát jelenthet, hogy egy túlcsorduló rekord túlcsordulttá tehet egyébként nem túlcsorduló elemeket is. • A probléma megoldása az lehet, ha az elemeket két lépesben helyezzük el a táblázatban. • Első körben azokat, amelyek szabályosan a helyükre pakolhatók, • majd ezek után a kimaradókat (ezek mindegyike túlcsordult lesz majd).
A nyílt címzés módszere Nyílt címzés esetén egy elem a tárhelyről fizikailag semmiképpen sem törölhető, ugyanis a helyén maradó üres tárhely megállítaná a keresést. Emiatt az ilyen kulcstranszformációs táblázatban egy tárhelynek három állapota lehet attól függően, hogy • érvényes elemet, • vagy (logikailag) törölt elemet tartalmaz, • vagy egyszerűen üres. Új elem beszúrásakor az új elemet üres vagy legalább törölt helyre szúrjuk be.
Láncolással történő nyílt címzés módszere • A nyílt címzéssel történő szinonima kezelés hátránya: túlcsordult elemek esetén az elem elsődleges helyén (ahová a Hash-függvény leképezné) nincs semmi információ az elem tényleges helyére vonatkozóan. • Ezt javítja egy másik szinonimakezelési technika, a láncolással történő nyílt címzés módszere. • A tárhely eddigi két oszlopa (kulcs és adat) mellé fel kell venni egy harmadikat. A mutató oszlopban található értékek megadják az adott helyről, vele azonos hash-értékű kulccsal először túlcsorduló elem címét (sorszámát). Ezen értékek segítségével a szinonim elemeket egy-egy láncban fűzzük fel. Amennyiben a mutató mezőben található érték NIL vagy nulla értékű, akkor az adott tárhelyről (ugyanazon hash-értékű kulccsal) nem történt túlcsordulás – vagy már törölve lett a túlcsorduló elem.
Láncolással történő nyílt címzés módszere • A szinonimák a láncon keresztül gyorsan elérhetők, viszont nő a tárfoglalási és a karbantartási idő. • Nyílt címzés, illetve láncolással történő nyílt címzés módszere esetén az „várható”, hogy a túlcsordult elemek a túlcsordulás helyéhez viszonylag közel legyenek, • az elemek tárolásához a ténylegesen szükséges tárhelynél kb. 10%-kal több tárhelyet szokás lefoglalni. Ez tovább növeli a módszerek tárhely igényét.
Független túlcsordulási lista alkalmazása • Ennél a módszernél az azonos helyről túlcsordult rekordokat külön listákban, és nem a „folytonos tárban” helyezzük el. • Ezúttal a mutató oszlopban található értékek egyirányban láncolt listák fejmutatóiként funkcionálnak. (Amúgy hasonlít az előzőre.) • Az így elkészített táblázatba a nem túlcsorduló elemek kerülnek, • a szinonim elemek pedig a Hash-függvény által jelzett helyről kiinduló egy irányban láncolt listába kerülnek.
Kulcstranszformációs táblázatokon végzehető műveletek Asszociatív adatszerkezet, mert ilyen táblázatnál az asszociatív csoportosítást a szinonimák adják. Szinonimák létezése esetén ezek a csoportok nem 1 elemű részhalmazokat fognak alkotni. • Létrehozás: • Szinonima kezelési technika választása, • Hash-függvény választás (szempontjai már voltak). • A gyakorlatban előforduló kulcsok számára adni kell valamilyen becslést, • majd tárhelyet kell foglalni a leendő elemek számára (1., 2.: +10% ; 3: annyi, amennyi), • és végül az elemek elhelyezése a tárban.
Kulcstranszformációs táblázatokon végzehető műveletek • Bővítés: • Kulcsok alapján a Hash-függvény segétségével, és az előzőekben említettek figyelembe vételével történik. • Törlés: • Logikai törlés: Minden módszer esetén működik. • Fizikai törlés: A harmadik módszernél a független túlcsrdulási listákban elhelyezett elemek esetében lehetséges. • Csere: • Kulcs alapján megoldható. Értékeit lehet cserélni bármikor. A kulcs cseréje törléssel és bővítéssel megoldható.
Kulcstranszformációs táblázatokon végzehető műveletek • Rendezés: Nincs (nem értelmezett) • Elérés: • Kvázi közvetlen, hiszen a Hash-függvény a közvetlen elérést szolgálja. A szinonimákat viszont keresni kell. • Keresés: • A szinonimakezelési módszertől függ. • Feldolgozás: • Alapja a Hash-függvény, illetve rajta keresztül a „kvázi közvetlen” elérés. A táblázat, mint adatszerkezet nagyon sok különböző jellegű problémánál előkerül. Sok operációs rendszer adatbázis kezelő rendszere használ különböző célokra táblázatokat. Igazi jelentőségük az állományok kezelésénél van.
Lista adatszerkezet Szekvenciális adatszerkezetek • Minden elem két másik elemmel van kapcsolatban, kivéve az első és az utolsó elemet. • Lista, mint absztrakt adatszerkezet. • Dinamikus adatszerkezet • Van első és utolsó eleme - kivéve az üres listát. • Minden elemnek van rákövetkezője - kivéve az utolsó elemet. • És minden elemnek van megelőzője - kivéve az első elemet. • Lista jelölése: • Q=[x1,x2, … ,xn] • ahol az x-szel jelölt dolgok a lista elemei.
Lista adatszerkezet • Az üres listának egy eleme sincs: [ ]. • A lista első elemét szokás a lista fejének is nevezni. • Azt a listát amelyik úgy keletkezik, hogy az eredeti listából elhagyjuk a fejet (első elemet), a lista farkának hívjuk. • Fej: [x1] • Farok: [x2, … ,xn] • Vége: [xn] • A lista mérete alatt az elemeinek a számát értjük. • Méret jelölése: |Q| (=n). • Ezek speciális lista fogalmak voltak.
Lista műveletei Műveletei: (alap lista műveletek). • Hozzáférés (elérés): • Minden elem a többitől függetlenül, közvetlenül elérhető. Q[i]=xi. • Az elemek elérése sorszámhivatkozással történik. • Ha nem létező sorszámra hivatkozunk, akkor a hozzáférés az üres listát adja. • Allista képzés: • Q[i..j]=[xi,xi+1, … ,xj-1,xj] • Az eredeti listának két megadott sorszámú eleme közötti részlistát adja eredményül. • Ha az i sorszám értéke<1, akkor az allistaképzés az első elemtől indul, ha a j értéke >n, akkor az n-edik elmig tart. • Összefűzés (konkatenáció, egyesítés): • R=[y1,y2, … ,ym] Q&R=[x1,x2, … ,xn, y1,y2, … ,ym]
Lista, mint absztrakt adatszerkezet műveletei Ezek a speciális lista műveletek fontosak, mert az összes többi műveletetet ennek a háromnak a segítségével lehet definiálni: • Létrehozás: • Létrehozákor explicit módon megadjuk a lista elemeit, amelyek a felsorolás sorrendje alapján kapják sorszámaikat. • Bővítés: • A listát bárhol bővíthetjük. • A bővítést részlista képzéssel és konkatenációval realizálhatjuk. • Ha a listát a k-adik elem után akarom bővíteni egy új elemmel, azt úgy tehetem meg: Q[1..k]&[elem] &Q[k+1..n].
Lista, mint absztrakt adatszerkezet műveletei • Törlés: • Fizikai törlést jelent. K-adik elem törlése: Két allista képzéssel és az eredményük konkatenálásával tehetjük meg: Q[1..k-1]&Q[k+1..n] • Csere: Értelmezett: • Allista képzésekkel és konkatenációval realizálható k-adik elem cseréje: Q[1..k-1]&[x] &Q[k+1..n] • A két részlista közé beillesztjük az új elemet, majd a részeket összefüzzük.
Lista, mint absztrakt adatszerkezet műveletei • Rendezés: • Minden értelmezett, akármelyik használható. • Keresés: • Teljes keresés, ill. • rendezett listánál lineáris vagy bináris (ez ábrázolás függő is). • Feldolgozás: • Lista elemeit dolgozza fel. • A speciális lista műveletekkel.
Lista ábrázolása • Ábrázolás: Mindkét módszerrel (folytonos, szétszórt) szokásos. • Szétszórt ábrázolási módok közül a két irányban láncolt lista a legpraktikusabb. • A lista alapvető szerepe olyan problémáknál, ahol az elemek között valamilyen nem értékeken, hanem például időbeliségen alapuló sorrend van, illetve ahol az elemek elérését mindig közvetlenül szeretnénk megoldani.
Speciális Listák • Ezeknél többnyire csak az alábbi hat speciális művelet némelyike használatos. • Ezek a lista első és utolsó elemének kezelésére szolgálnak. • ACCES HEAD: Q[1] • PUSH: Q[x] &Q • POP: Q[1] és QQ[2..n] • ACCESS END: Q[n] • INJECT: QQ &[x] • EJECT: Q[n] és QQ[1..n-1]
Speciális Listák • Verem: • Egy speciális lista adatszerkezet. Az előbbi műveletek közül az • ACCES HEAD • PUSH • POP műveleteket lehet értelmezni rajta. • A verem alján van a legkisebb sorszámú elem, feljebb egyre nagyobb sorszámúak. A vermet LIFO (last in first out) adatszerkezetnek is szokás nevezni. • Az utolsónak érkezett fog először távozni.
Speciális Listák: Verem • Létrehozáskor mindig az üres vermet hozzuk létre. • Bővítés: A Push művelet alkalmazásával. • Az elemeket érkezésük sorrendjében egymás felé pakoljuk a veremben. • Feldolgozáskor csak a legfelső elem hozzáférhető • ACCESSHEAD • POP (Egyben fizikai törlés is) • Törlés: csak fizikai, csak a legutolsó elemet lehet. • Rendezés: nem értelmezett; • Keresés: nem értelmezett; • Elérés: Csak a legutoljára elhelyezett elemet lehet.
Speciális Listák: Verem Ábrázolás: Mindkét módon Folytonos reprezentáció esetén • van egy verem mutató, amely jelzi, hogy aktuálisan hány elem van a veremben. • Egyúttal ez a verem mutató a verem tetejét is címzi. • A verem üres, ha nincs egy eleme sem, a verem mutató értéke ilyenkor nulla. • A verem tele van, ha nincs több hely a veremben, veremmutató értéke, vm=n. • PUSH: Ha a veremben még van hely, az új elemet az vm+1-edik helyre tesszük, majd a veremmutató értéke egyel növeljük. • POP: Ha a verem nem üres, a veremmutató által mutatott helyről vesszük ki az elemet, majd a verem mutató értékét eggyel csökkentjük.
Speciális Listák: Verem Szétszórt reprezentáció • Egy irányban láncolt listát használhatunk. • PUSH: Egy irányban láncolt lista első eleme előtti bővítéssel • Ha a verem üres, a fejmutató értéke NIL. • A verem implementációjakor ezeket el kell rejteni, de azért tudnunk kell, hogy üres-e a verem, vagy esetleg tele van-e. A verem alapvető fontosságú az olyan problémák kezelésénél, ahol az elemeket felbukkanási sorrendjük fordítottjában kell feldolgozni. A tömb mellett a másik legalapvetőbb adatszerkezet. Programozási nyelveknél az alprogram hívási láncok kezelésénél van alapvető szerepe.
Speciális Listák: Sor • A sor adatszerkezet olyan speciális lista, amelyet a műveletei definiálnak. • 1. ACCESS HEAD • 3. POP itt GET-nek nevezzük • 5. INJECT itt PUT-nak nevezzük • Kiegészítésként kiemeljük az első és az utolsó elemet • FIFO adatszerkezetnek is nevezik (First In First Out) • Ennek megfelelően a sorba az elemek az érkezésnek megfelelő sorrendben kerülnek, az újak mindig a sor végére kerülnek • Feldolgozni a sor első elemét szokás, ami egyben fizikai törlést is jelent
Speciális Listák: Sor • Sorba történő írás művelete, PUT művelet, • az olvasás (fizikai törlés) művelete a GET művelet. • Logikai törlés nincs • Rendezés nincs értelmezve • Keresés nincs értelmezve • Elérés: Csak az első elemet tudjuk elérni • Feldolgozás a fejmutató által hivatkozott elemet • Bővítés: az utolsó mutató után a mutatók átállításával
Speciális Listák: Sor Ábrázolás • Szétszórt: • egyirányban láncolt listával, • két segédmutatóval (fej és vége mutató) • Folytonos: • Folytonos reprezentációk mindegyike egy vektorban tárolja a sor elemeit • Fontos a sor elejének és végének jelzése
Speciális Listák: Sor Folytonos ábrázolás tipikus formái: • Fix kezdetű sor • Vándorló sor • Ciklikus sor Speciális sorok: • Két végű sor • Prioritásos sor
Speciális Listák: Sor Fix kezdetű sor • A sor első eleme a vektor első tárhelyén helyezkedik el, az utolsó elem mutatója v. • Üres a sor: v=0 • Tele van a sor: v=n • Új elem beírása: v+1-edik helyre kerül, majd v eggyel megnő. • Elem törlése: Nehézkes, több adatmozgatás, a sor első elemét dolgozzuk fel. A sor eleje pedig mindig ugyanott kell, hogy legyen, ezért törlés után a többi elemet rámozgatjuk az előző pozícióra. V értéke eggyel csökken.
Speciális Listák: Sor Vándorló sor • A sokszori adatmozgatást küszöböli ki • Elvetjük azt a megszorítást, hogy az első elem az első helyen álljon. Megengedjük, hogy az első elem helye vándoroljon. • Ehhez segédmutatók, e és a szokásos v szükséges • Üres a sor: e=v=0 • Tele a sor: e=1, v=n • Új elem bekerülése: A v mutatót követő pozícióra kerül be, ha a sor nincsen tele. • Bővítéskorkor előfordulhat, hogy a v az utolsón áll, de az e vándorlása miatt a sor nincs tele: ilyenkor (csak ilyenkor), adatmozgatást hajtunk végre: A legelső pozícióig toljuk a sort előre.
Speciális Listák: Sor Ciklikus sor: Az adatmozgatást eddig még nem küszöböltük ki teljesen. A ciklikus sorban az elejét és végét jelző mutató vándorlását a határokon keresztül is megengedjük: • Üres a sor: e=v=0 • Tele a sor: e=1 és v=n, vagy v+1=e. • Új elem: szabályokat figyelembe véve, ha a sor nincs tele, akkor a v+1-edik helyre kerül, (esetleg v visszaugrik az elejére). • Törlés: e mutató által mutatott elem, majd e=e+1. (Esetleg e visszaugrik az elejére.)