Adatszerkezetek és algoritmusok

Hash táblázat adatszerkezet oktatóanyag

Hash táblázat adatszerkezet oktatóanyag
A számítástechnikában a „térkép” szó azt jelenti, hogy az egyik készlet egy elemét összekapcsolják egy másik készlet egy másik elemével. Képzelje el, hogy egy oldalon bal oldalon egy körben vannak szavak, és ugyanazon az oldal jobb oldalán található egy másik kör, amelyen belül vannak más szavak. Tegyük fel, hogy minden körben a szavakat véletlenszerűen írják, szétszórva a körön belül. Tegyük fel továbbá, hogy a bal kör szavait kulcsoknak, a jobb körben lévő szavakat pedig értékeknek nevezzük. Ha a bal oldalon lévő szavakból nyíl rajzolódik a jobb oldalon lévő szavakba, akkor azt mondanánk, hogy a kulcsok hozzárendelve vannak az értékekhez.

Tegyük fel, hogy Ön egy nagy ellátási üzlet tulajdonosa abban a megyében, ahol él. Tegyük fel, hogy nagy területen él, amely nem kereskedelmi terület. Nem csak Ön rendelkezik ellátási üzletrel a környéken; van néhány versenytársad. És akkor eszedbe jut, hogy ügyfelek telefonszámait rögzítsd egy füzetbe. Természetesen a füzet kicsi, és nem tudja felvenni az összes telefonszámot az összes vásárló számára.

Tehát úgy dönt, hogy csak a törzsvásárlói telefonszámokat rögzíti. Tehát van egy táblázata két oszloppal. A bal oldali oszlop tartalmazza az ügyfelek nevét, a jobb oldali oszlop pedig a megfelelő telefonszámokat. Ily módon az ügyfelek nevei és a telefonszámok leképezésre kerülnek. A táblázat jobb oldali oszlopa tekinthető az alap hash táblának. Az ügyfélneveket most kulcsoknak hívják, a telefonszámokat pedig értékeknek. Ne feledje, hogy amikor egy ügyfél átutalásba megy, akkor le kell mondania a sorát, lehetővé téve a sor üres vagy új törzsvásárlóval történő cseréjét. Vegye figyelembe azt is, hogy idővel a törzsvásárlók száma nőhet vagy csökkenhet, és így az asztal növekedhet vagy zsugorodhat.

A feltérképezés másik példájaként tegyük fel, hogy van egy megyében gazdálkodói klub. Természetesen nem minden gazda lesz a klub tagja. A klub egyes tagjai nem lesznek rendszeres tagok (jelenlétben és közreműködésben). Az ügyvédnő dönthet úgy, hogy rögzíti a tagok nevét és az általuk választott italt. Két oszlopból álló táblázatot dolgoz ki. A bal oldali oszlopba írja a klubtagok nevét. A jobb oszlopba írja a megfelelő választott italt.

Itt van egy probléma: vannak duplikátumok a jobb oldali oszlopban. Vagyis egy ital ugyanazon neve többször megtalálható. Más szavakkal, a különböző tagok ugyanazt az édes italt vagy ugyanazt az alkoholos italt, míg a többi tag más édes vagy alkoholos italt fogyaszt. Az ügyvédnő úgy dönt, hogy megoldja ezt a problémát egy keskeny oszlop beszúrásával a két oszlop közé. Ebben a középső oszlopban, felülről indulva, megszámolja a nullától kezdődő sorokat (azaz.e. 0, 1, 2, 3, 4 stb.), lefelé haladva, soronként egy index. Ezzel megoldódik a problémája, mivel a tag neve most egy indexhez kapcsolódik, és nem egy ital nevéhez. Tehát, mivel egy italt egy index azonosít, az ügyfél neve a megfelelő indexhez van hozzárendelve.

Az értékek (italok) oszlop önmagában képezi az alap hash táblázatot. A módosított táblázatban az indexek oszlopa és a hozzájuk tartozó értékek (duplikákkal vagy anélkül) normál hash táblázatot alkotnak - a hash tábla teljes meghatározása az alábbiakban található. A kulcsok (első oszlop) nem feltétlenül képezik a hash tábla részét.

Ismét egy másik példa egy hálózati szerver, ahol az ügyfélszámítógépének felhasználója hozzáadhat néhány információt, törölhet vagy módosíthat információkat. A kiszolgálónak sok felhasználója van.  Minden felhasználónév a szerveren tárolt jelszónak felel meg. A szervert karbantartók láthatják a felhasználóneveket és a hozzájuk tartozó jelszavakat, és így képesek megrontani a felhasználók munkáját.

Tehát a kiszolgáló tulajdonosa úgy dönt, hogy létrehoz egy olyan funkciót, amely titkosítja a jelszót a tárolás előtt. A felhasználó a szokásos megértett jelszavával jelentkezik be a szerverre. Most azonban minden jelszót titkosított formában tárolnak. Ha bárki meglát egy titkosított jelszót, és megpróbál bejelentkezni annak használatával, az nem fog működni, mert a bejelentkezéskor a szerver megértett jelszót kap, és nem titkosított jelszót.

Ebben az esetben a megértett jelszó a kulcs, és a titkosított jelszó az érték. Ha a titkosított jelszó a titkosított jelszavak oszlopában található, akkor ez az oszlop egy alapvető hash-táblázat. Ha ezt az oszlopot megelőzi egy másik, nullától kezdődő indexekkel rendelkező oszlop, így minden titkosított jelszó indexhez van társítva, akkor az indexek oszlop és a titkosított jelszó oszlop egyaránt egy normál hash-táblát alkot. A kulcsok nem feltétlenül részét képezik a hash táblának.

Ebben az esetben vegye figyelembe, hogy minden kulcs, amely megértett jelszó, megegyezik egy felhasználói névvel. Tehát van egy felhasználónév, amely megfelel egy indexhez leképezett kulcsnak, amely egy titkosított kulcs értékéhez van társítva.

A hash függvény meghatározása, a hash tábla teljes meghatározása, egy tömb jelentése és egyéb részletek az alábbiakban találhatók. A bemutató többi részének értékelése érdekében ismeretekkel kell rendelkeznie mutatókban (referenciák) és összekapcsolt listákban.

A hash funkció és a hash táblázat jelentése

Sor

A tömb egymást követő memóriahelyek halmaza. Az összes helyszín azonos méretű. Az első helyen lévő érték elérése az index, 0; a második helyen lévő értéket az index, 1 segítségével érjük el; a harmadik értékhez az index, 2; negyedik indexszel, 3; stb. Egy tömb általában nem növekedhet vagy zsugorodhat. A tömb méretének (hosszának) megváltoztatásához új tömböt kell létrehozni, és a megfelelő értékeket át kell másolni az új tömbbe. Egy tömb értékei mindig azonos típusúak.

Hash funkció

A szoftverben a hash függvény olyan funkció, amely kulcsot vesz és egy indexet hoz létre egy tömb cellához. A tömb rögzített méretű (fix hosszúságú). A kulcsok száma tetszőleges méretű, általában nagyobb, mint a tömb mérete. A hash függvényből származó indexet hash értéknek vagy összefoglalónak, hash kódnak vagy egyszerűen hash-nak hívják.

Hash táblázat

A hash tábla egy értékeket tartalmazó tömb, amelynek indexei, kulcsai hozzárendelve vannak. A kulcsokat közvetett módon hozzárendelik az értékekhez. Valójában azt mondják, hogy a kulcsok hozzárendelve vannak az értékekhez, mivel minden indexhez tartozik egy érték (duplikátumok nélkül vagy anélkül). Az a funkció azonban, amely leképezi (azaz.e. hashing) a tömbindexekhez és nem igazán az értékekhez kapcsolja a kulcsokat, mivel előfordulhatnak duplikátumok az értékekben. Az alábbi ábra egy kivonat táblázatot mutat be az emberek nevéhez és telefonszámához. A tömb cellákat (slotokat) vödörnek nevezzük.

Figyelje meg, hogy néhány vödör üres. A hash tábla nem feltétlenül tartalmaz minden értéket értékeket. A vödrökben szereplő értékeknek nem feltétlenül kell növekvő sorrendben lenniük. Azok a mutatók azonban, amelyekhez kapcsolódnak, növekvő sorrendben vannak. A nyilak jelzik a leképezést. Figyelje meg, hogy a kulcsok nem tömbben vannak. Nem kell, hogy bármilyen struktúrában legyenek. A hash függvény bármelyik kulcsot elveszi, és egy tömb indexét kivonja. Ha az index kivonatolással társított csoportban nincs érték, akkor új értéket lehet beilleszteni abba a csoportba. A logikai kapcsolat a kulcs és az index között van, nem pedig a kulcs és az indexhez társított érték között.

A tömb értékei, hasonlóan ehhez a hash-táblához, mindig azonos adattípusúak. A hash tábla (vödrök) összekapcsolhatja a kulcsokat a különböző adattípusok értékeivel. Ebben az esetben a tömb értékei mind mutatók, amelyek különböző értéktípusokra mutatnak.

A hash tábla hash funkcióval rendelkező tömb. A függvény elvesz egy kulcsot, és kivonatolja a megfelelő indexet, és így összekapcsolja a kulcsokat az értékekkel a tömbben. A kulcsoknak nem kell, hogy a hash tábla részei legyenek.

Miért tömb és nem összekapcsolt lista a hasási táblázathoz

A hash tábla tömbjét lecserélheti egy összekapcsolt lista adatstruktúrára, de probléma lenne. A csatolt lista első eleme természetesen a 0 indexen van; a második elem természetesen az indexen van, 1; a harmadik természetesen az indexen van, 2; stb. A csatolt listával az a probléma, hogy egy érték lekéréséhez a listát át kell ismételni, és ez időbe telik. A tömbben lévő érték elérése véletlenszerű hozzáféréssel történik. Miután az index ismert, az értéket iteráció nélkül kapjuk meg; ez a hozzáférés gyorsabb.

Ütközés

A hash függvény megfog egy kulcsot és kivonatolja a megfelelő indexet a hozzá tartozó érték beolvasásához vagy egy új érték beszúrásához. Ha egy érték kiolvasása a cél, addig nincs probléma (nincs probléma). Ha azonban egy érték beillesztése a cél, akkor a kivonatolt indexnek már lehet társított értéke, és ez ütközés; az új értéket nem lehet oda tenni, ahol már van érték. Az ütközés megoldásának számos módja van - lásd alább.

Miért történik az ütközés

A fenti áruházi példában a vásárló neve a kulcs, az ital neve pedig az érték. Figyelje meg, hogy az ügyfelek száma túl sok, míg a tömb mérete korlátozott, és nem tudja az összes ügyfelet elvenni. Tehát csak a törzsvásárlók italait tárolják a tömbben. Az ütközés akkor következne be, amikor egy nem törzsvásárló rendszeressé válik. Az üzlet vásárlói nagy készletet alkotnak, míg a tömbben lévő ügyfelek számára a vödrök száma korlátozott.

A kivonat tábláknál a kulcsok értékei nagyon valószínűek, amelyeket rögzítenek. Amikor egy olyan kulcs, amely nem valószínű, valószínűvé válik, valószínűleg ütközés következik be. Valójában az ütközés mindig hash táblákkal történik.

Ütközés elhárításának alapjai

Az ütközés feloldásának két megközelítését hívják külön láncolásnak és nyílt címzésnek. Elméletileg a kulcsoknak nem lehetnek az adatstruktúrában, vagy nem lehetnek a hash tábla részei. Mindkét megközelítés azonban megköveteli, hogy a kulcsoszlop megelőzze a hash táblázatot, és a teljes szerkezet részévé váljon. Ahelyett, hogy a kulcsok a kulcsok oszlopban lennének, a kulcsokra mutató mutatók a kulcsok oszlopban lehetnek.

Egy praktikus hash tábla tartalmaz kulcsok oszlopot, de ez a kulcs oszlop hivatalosan nem része a hash táblának.

Bármelyik megoldás esetén a felbontás üres lehet, nem feltétlenül a tömb végén.

Külön láncolás

Külön láncoláskor, amikor ütközés történik, az új érték hozzáadódik az ütközött érték jobb oldalához (nem fölé vagy alá). Tehát két vagy három értéknek ugyanaz az indexe. Ritkán több mint háromnak kell azonos indexűnek lennie.

Egynél több értéknek is lehet ugyanaz az indexe egy tömbben? - Nem. Tehát sok esetben az index első értéke egy hivatkozott lista adatstruktúrára mutató mutató, amely az egy, kettő vagy három ütköző értéket tartalmazza. Az alábbi ábra egy kivonatoló táblázat példája az ügyfelek és telefonszámaik külön láncolásához:

Az üres vödröket x betű jelöli. A többi rés mutatója linkelt listákra mutat. A csatolt lista minden elemének két adatmezője van: az egyik az ügyfél nevéhez, a másik a telefonszámhoz. Konfliktus következik a kulcsokkal kapcsolatban: Peter Jones és Suzan Lee. A megfelelő értékek egy összekapcsolt lista két eleméből állnak.

Az ütköző kulcsok esetében az érték beillesztésének kritériuma ugyanaz a kritérium, amelyet az érték megkeresésére (és beolvasására) használnak.

Nyissa meg a Címzés lehetőséget

Nyitott címzés esetén az összes értéket a tároló tömb tárolja. Konfliktus bekövetkezésekor az új értéket beillesztjük egy üres csoportba, amely új kritériumot követve a konfliktus megfelelő értékét adja. A konfliktusban szereplő érték beillesztésére alkalmazott kritérium ugyanaz a kritérium, amelyet az érték megkeresésére (keresésére és olvasására) használnak.

Az alábbi ábra a konfliktusok megoldását mutatja be nyílt címzéssel:

A hash függvény megfogja a kulcsot, Peter Jones és kivonja az indexet (152), és tárolja telefonszámát a hozzá tartozó tárolóban. Egy idő után a hash függvény ugyanazt a 152-es indexet hasítja el a kulcstól, Suzan Lee-től, aki ütközik Peter Jones indexével. Ennek megoldása érdekében a Suzan Lee értékét a következő, 153 index indexében tárolják, amely üres volt. A hash függvény kivonja az indexet, a kulcsot, Robin Hood 153-at, de ezt az indexet már használták egy korábbi kulcs ütközésének feloldására. Tehát Robin Hood értéke a következő üres vödörbe kerül, ami a 154. index értéke.

Konfliktusok megoldásának módszerei külön láncoláshoz és nyílt címzéshez

A külön láncolásnak megvannak a maga módszerei a konfliktusok megoldására, és a nyílt címzésnek is megvannak a maga módszerei a konfliktusok megoldására.

Módszerek külön láncolási konfliktusok megoldására

A különálló láncolási hash-táblázatok módszereit röviden ismertetjük:

Külön láncolás összekapcsolt listákkal

Ez a módszer a fentiekben leírtak szerint történik. Az összekapcsolt lista minden elemének azonban nem feltétlenül kell tartalmaznia a kulcsmezőt (pl.g. a fenti ügyfélnév mező).

Külön láncolás a fejlécek listájával

Ebben a módszerben a csatolt lista első elemét a tömb egy vödörében tároljuk. Ez akkor lehetséges, ha a tömb adattípusa a csatolt lista eleme.

Külön láncoljon más szerkezetekkel

Bármely más adatstruktúra, például a szükséges műveleteket támogató önkiegyenlítő bináris keresési fa használható a csatolt lista helyett - lásd később.

Módszerek a nyílt címzési konfliktusok megoldására

A konfliktus megoldásának módját a nyílt címzés során próbasorozatnak nevezzük. Három ismert próba-szekvenciát ismertetünk röviden:

Lineáris tapintás

Lineáris szondázás esetén, amikor konfliktus lép fel, a konfliktusban lévő kanál alatt keressük a legközelebbi üres vödröt. Lineáris tapintással a kulcs és az értéke is ugyanabban a vödörben tárolódik.

Másodlagos szondázás

Tegyük fel, hogy a H indexnél konfliktus lép fel. A következő üres rés (vödör) a H + 1 indexnél2 használt; ha ez már foglalt, akkor a következő üres a H + 2-nél2 van használva, ha ez már foglalt, akkor a következő üres H + 3-nál2 használják, és így tovább. Ennek vannak változatai.

Dupla hashelés

A kettős kivonatolással két kivonatolási funkció létezik. Az első kiszámítja (kivonatolja) az indexet. Ha ütközés következik be, a második ugyanazzal a kulccsal határozza meg, hogy az értéket milyen mélyre kell beszúrni. Van még ebben valami - lásd később.

Tökéletes hash funkció

A tökéletes hash függvény olyan hash függvény, amely nem eredményezhet ütközést. Ez akkor fordulhat elő, ha a kulcskészlet viszonylag kicsi, és mindegyik kulcs a hash tábla egy adott egész számához kapcsolódik.

Az ASCII karakterkészletben a nagybetűk hash függvény segítségével leképezhetők a megfelelő kisbetűkre. A betűk a számítógép memóriájában számként vannak feltüntetve. Az ASCII karakterkészletben A 65, B 66, C 67 és így tovább. és a értéke 97, b értéke 98, c értéke 99 stb. A-tól a-ig történő térképezéshez adjunk hozzá 32-t 65-ig; B-től b-ig történő térképezéshez adjunk hozzá 32-t 66-ig; C-től c-ig történő térképezéshez adjunk hozzá 32-t 67-ig; stb. Itt a nagybetűk a kulcsok, a kisbetűk pedig az értékek. Ennek hash táblája lehet egy tömb, amelynek értékei a társított indexek. Ne feledje, hogy a tömb vödörei üresek lehetnek. Tehát a tömbben lévő vödrök 64 és 0 között üresek lehetnek. A hash függvény egyszerűen hozzáadja a 32-et a nagybetűs kódszámhoz az index megszerzéséhez, és ezért a kisbetű. Egy ilyen funkció tökéletes hash függvény.

Hegesztés az egész számtól az egész indexig

Különböző módszerek léteznek az egész szám kivonatolására. Az egyiket Modulo osztási módszernek (függvénynek) hívják.

A Modulo osztály hash funkciója

A számítógépes szoftverben szereplő funkció nem matematikai függvény. A számítástechnikában (szoftver) a függvény állításokból áll, amelyeket argumentumok előznek meg. A Modulo Division Function esetében a kulcsok egész számok, és a csoportok tömbjének indexeihez vannak hozzárendelve. A kulcskészlet nagy, ezért csak azokat a kulcsokat térképezzük fel, amelyek nagy valószínűséggel előfordulnak a tevékenység során. Tehát ütközések történnek, amikor a valószínűtlen kulcsokat feltérképezni kell.

A nyilatkozatban,

20/6 = 3R2

20 az osztalék, 6 az osztó, 3 pedig a maradék 2 a hányados. A maradék 2-t modulo-nak is nevezik. Megjegyzés: lehetséges, hogy a modulója 0 legyen.

Ehhez a hashhoz az asztal mérete általában 2, pl.g. 64 = 26 vagy 256 = 28, stb.  Ennek a hash függvénynek az osztója a tömb méretéhez közeli prímszám. Ez a függvény elosztja a kulcsot az osztóval és visszaadja a modulót. A modulo a vödörtömb indexe. A tárolóban lévő társított érték az Ön által választott érték (a kulcs értéke).

Változtatható hosszúságú kulcsok tárolása

Itt a kulcskészlet kulcsai különböző hosszúságú szövegek. Különböző egész számok tárolhatók a memóriában azonos számú bájt használatával (az angol karakter mérete bájt). Ha a különböző kulcsok különböző bájtméretűek, akkor azt mondják, hogy változó hosszúságúak. A változó hosszúságú hasholás egyik módszerét Radix konverziós hash-nak hívják.

Radix konverziós hash

Egy karakterláncban a számítógép minden karaktere szám. Ebben a módszerben,

Hash kód (index) = x0ak − 1+x1ak − 2+… + Xk − 2a1+xk − 1a0

Ahol (x0, x1,…, xk − 1) a bemeneti karakterlánc karakterei, a pedig egy radix, e.g. 29. (lásd később). k a karakterláncok száma. Van még ebben valami - lásd később.

Kulcsok és értékek

Kulcs / érték párban az érték nem feltétlenül szám vagy szöveg. Rekord is lehet. A rekord egy vízszintesen írt lista. Egy kulcs / érték párban minden kulcs valóban más szövegre vagy számra vagy rekordra utal.

Asszociatív tömb

A lista egy adatszerkezet, ahol a listaelemek kapcsolódnak egymáshoz, és a műveletek sora működik a listán. Minden listaelem pár elemből állhat. Az általános hash tábla a kulcsaival adatstruktúrának tekinthető, de ez inkább rendszer, mint adatstruktúra. A kulcsok és a hozzájuk tartozó értékek nem nagyon függnek egymástól. Nem nagyon kapcsolódnak egymáshoz.

Másrészt az asszociatív tömb hasonló dolog, de a kulcsok és értékeik nagyon függenek egymástól; nagyon kapcsolódnak egymáshoz. Például lehet asszociatív tömbje a gyümölcsöknek és azok színeinek. Minden gyümölcsnek természetesen megvan a színe. A gyümölcs neve a kulcs; a szín az érték. A behelyezés során minden kulcs beillesztésre kerül annak értékével. Törléskor minden kulcs törlődik az értékével együtt.

Az asszociatív tömb egy hash tábla adatstruktúra, amely kulcs / érték párokból áll, ahol nincs másolat a kulcsokhoz. Az értékek duplikátumok lehetnek. Ebben a helyzetben a kulcsok a szerkezet részét képezik. Vagyis a kulcsokat tárolni kell, míg az általános sietőtáblával a kulcsokat nem kell tárolni. A duplikált értékek problémáját természetesen megoldják a vödörtömb indexei. Ne tévessze össze az ismétlődő értékeket és az ütközéseket egy indexen.

Mivel az asszociatív tömb adatszerkezet, ezért legalább a következő műveleteket hajtja végre:

Asszociatív tömb műveletek

beszúr vagy hozzáad

Ez új kulcs / érték párot illeszt be a gyűjteménybe, a kulcsot hozzárendelve az értékéhez.

hozzárendelni

Ez a művelet egy adott kulcs értékét új értékre cseréli.

törlés vagy eltávolítás

Ez eltávolítja a kulcsot és a hozzá tartozó értéket.

Nézz fel

Ez a művelet egy adott kulcs értékét keresi, és visszaadja az értéket (anélkül, hogy eltávolítaná).

Következtetés

A hash tábla adatstruktúrája egy tömbből és egy függvényből áll. A függvényt hash függvénynek hívják. A függvény a tömb indexein keresztül leképezi a tömb értékeit. A kulcsoknak nem feltétlenül kell az adatszerkezet részét képezniük. A kulcskészlet általában nagyobb, mint a tárolt értékek. Ha ütközés következik be, akkor vagy külön láncolási módszerrel, vagy pedig nyitott címzési módszerrel oldják meg. Az asszociatív tömb a hash tábla adatstruktúrájának speciális esete.

Az egér és az érintőpadok görgetési irányának megfordítása a Windows 10 rendszerben
Egér és Érintőpads nemcsak a számítást könnyűvé, de hatékonyabbá és kevésbé időigényessé is teszi. Nem tudunk elképzelni egy életet ezek nélkül az esz...
Az egérmutató és a kurzor méretének, színének és sémájának módosítása a Windows 10 rendszeren
Az egérmutató és a kurzor a Windows 10 operációs rendszerben nagyon fontos szempont. Ez elmondható más operációs rendszerekről is, tehát valójában eze...
Ingyenes és nyílt forráskódú játékmotorok a Linux játékok fejlesztéséhez
Ez a cikk felsorolja azokat az ingyenes és nyílt forráskódú játékmotorokat, amelyek felhasználhatók 2D és 3D játékok fejlesztésére Linuxon. Számos ily...