Hash táblázat az adatstruktúrában: Python Példa

⚡ Okos összefoglaló

Az adatszerkezetekben a hash tábla kulcs-érték párokként tárolja az értékeket, és egy hash függvény segítségével minden kulcsot egy indexhez rendel a gyors keresés érdekében. Ez az anyag a hash függvényeket, ütközéseket, láncolást, szondázást, műveleteket és magyarázatokat ismertet. Python példák, beleértve a beépített szótárat is.

  • 🔑 Alapötlet: A hash tábla kulcs-érték párokat tárol, ahol egy hash függvény minden kulcsot tömbindexsé alakít.
  • 🧮 Hash függvény: Egy gyakori képlet a h(k) = k % m modulus operátort használja a kulcsok táblázatméreten belül tartására.
  • 💥 Ütközések: Amikor két kulcs ugyanarra az indexre tartozik, a láncolás vagy a próba feloldja az ütközést.
  • ⚡ Teljesítmény: A hash tábla kikeresési, beszúrási és törlési ideje átlagosan O(1) az adathalmaz méretétől függetlenül.
  • 🐍 Python Példa: A beépített szótártípus egy hash tábla, amely automatikusan kezeli a hashelést és az ütközéseket.

Mi az a Hashing?

A hash egy rögzített hosszúságú érték, amelyet egy matematikai képlet segítségével állítanak elő. A hash értékeket adattömörítésben, kriptológiában stb. használják. Az adatindexelésben a hash értékeket használjuk, mert rögzített hosszúságúak, függetlenül a generálásukhoz használt értékektől. Lehetővé teszi, hogy a hash értékek minimális helyet foglaljanak el más, változó hosszúságú értékekkel összehasonlítva.

A hash függvény egy matematikai algoritmust alkalmaz a kulcs hash-lé alakítására. Ütközés akkor következik be, ha egy hash függvény ugyanazt a hash értéket állítja elő több kulcshoz.

Mi az a hash-tábla?

A HASH TÁBLÁZAT egy olyan adatstruktúra, amely kulcs- és értékpár használatával értékeket tárol. Minden értékhez egyedi kulcs van hozzárendelve, amelyet egy hash függvény segítségével állítanak elő.

A kulcs neve a hozzá tartozó érték elérésére szolgál. Ez nagyon felgyorsítja az értékek keresését a hash táblában, függetlenül a hash táblában lévő elemek számától.

Hash funkciók

Például, ha az alkalmazottak nyilvántartásait szeretnénk tárolni, és minden alkalmazott egyedileg azonosítható egy alkalmazotti szám segítségével.

Kulcsként használhatjuk az alkalmazotti számot, értékként a munkavállalói adatokat rendelhetjük hozzá.

A fenti megközelítés további nagyságrendű szabad területet igényel (m * n2) ahol az m változó a mérete sor, az n változó pedig az alkalmazotti szám számjegyeinek száma. Ez a megközelítés tárhelyproblémát vezet be.

Egy hash függvény úgy oldja meg a fenti problémát, hogy megkeresi az alkalmazottak számát, és ezt felhasználja egy hash egész érték, fix számjegyek generálására, valamint a tárhely optimalizálására. A hash függvény célja egy kulcs létrehozása, amelyre a tárolni kívánt értékre hivatkozunk. A függvény elfogadja a mentendő értéket, majd egy algoritmus segítségével kiszámítja a kulcs értékét.

A következő egy példa egy egyszerű hash függvényre

h(k) = k1 % m

ITT,

  • h(k) az a hash függvény, amely elfogad egy k paramétert. A k paraméter az az érték, amelyhez a kulcsot ki szeretnénk számítani.
  • k1 % m a hash függvényünk algoritmusa, ahol k1 a tárolni kívánt érték, m pedig a lista mérete. A kulcs kiszámításához a modulus operátort használjuk.

Példa

Tegyük fel, hogy van egy listánk, amelynek fix mérete 3 és a következő értékek

[1,2,3]

A fenti képlet segítségével kiszámíthatjuk, hogy az egyes értékeknek milyen pozíciókat kell elfoglalniuk.

A következő kép a hash táblázatunkban elérhető indexeket mutatja.

Hash funkciók

Step 1) Számítsa ki azt a pozíciót, amelyet az első érték így fog elfoglalni

h(1) = 1 % 3

= 1

Az érték 1 fog elfoglalni a hely tovább index 1

Step 2) Számítsa ki azt a pozíciót, amelyet a második érték fog elfoglalni

h(2) = 2 % 3

= 2

Az érték 2 fog elfoglalni a hely tovább index 2

Step 3) Számítsa ki azt a pozíciót, amelyet a harmadik érték fog elfoglalni.

h(3) = 3 % 3

= 0

Az érték 3 fog elfoglalni a hely tovább index 0

Végeredmény

A kitöltött hash táblázatunk most a következő lesz.

Hash funkciók

A jó hash függvény tulajdonságai

Egy jó hash függvénynek a következő tulajdonságokkal kell rendelkeznie.

  • A hash generálására szolgáló képletnek az algoritmusban tárolandó adatértéket kell használnia.
  • A hash függvénynek egyedi hash értékeket kell generálnia még az azonos mennyiségű bemeneti adatokhoz is.
  • A funkciónak minimálisra kell csökkentenie az ütközések számát. Ütközések akkor fordulnak elő, ha ugyanazt az értéket egynél több értékhez állítják elő.
  • Az értékeket következetesen kell elosztani a lehetséges kivonatok között.

ütközés

Ütközés akkor következik be, ha az algoritmus ugyanazt a hash-t generálja egynél több értékhez.

Nézzünk egy példát.

Tegyük fel, hogy a következő értéklistával rendelkezünk

[3,2,9,11,7]

Tegyük fel, hogy a hash tábla mérete 7, és a (k1 % m) ahol m a hash tábla mérete.

A következő táblázat a létrehozandó hash értékeket mutatja be.

Kulcs Hash algoritmus (k1 % m) Hash érték
3 3% 7 3
2 2% 7 2
9 9% 7 2
11 11% 7 4
7 7% 7 0

Amint a fenti eredményekből láthatjuk, a 2-es és 9-es érték azonos hash-értékkel rendelkezik, és nem tárolhatunk egynél több értéket minden pozícióban.

Az adott probléma láncolással vagy szondázással is megoldható. A következő szakaszok részletesen tárgyalják a láncolást és a szondázást.

Láncolás

A láncolás egy olyan technika, amelyet az ütközés problémájának megoldására használnak olyan összekapcsolt listák használatával, amelyek mindegyike egyedi indexekkel rendelkezik.

A következő kép azt szemlélteti, hogyan néz ki egy láncolt lista

Láncolás

Mind a 2, mind a 9 ugyanazt az indexet foglalja el, de csatolt listákként tárolódnak. Minden listának egyedi azonosítója van.

A láncolt listák előnyei

A láncolt listák előnyei a következők:

  • A láncolt listák jobb teljesítményt nyújtanak adatok beszúrásakor, mivel a beszúrás sorrendje O(1).
  • A láncolt listát használó hash táblát nem szükséges átméretezni.
  • Könnyedén képes befogadni nagyszámú értéket, amíg van szabad hely.

Szondázás

A másik technika, amelyet az ütközés feloldására használnak, a szondázás. A szondázási módszer használatakor, ha ütközés történik, egyszerűen továbbléphetünk, és találhatunk egy üres helyet az értékünk tárolására.

A szondázási módszerek a következők:

Módszer Leírás
Lineáris tapintás Ahogy a név is sugallja, ez a módszer az ütközés helyétől kezdve lineárisan keresi az üres réseket, és halad előre. Ha a lista végére értünk, és nem található üres hely. A szondázás a lista elején kezdődik.
Másodlagos szondázás Ez a módszer másodfokú polinomiális kifejezéseket használ a következő szabad slot megtalálásához.
Double hashelés Ez a technika egy másodlagos hash függvény algoritmust használ a következő szabad hely megtalálásához.

A fenti példánkat használva a hash tábla a szondázás után a következőképpen fog megjelenni:

Szondázás

Hash tábla műveletek

Itt van a OperaA hash táblák által támogatott lehetőségek:

  • beszúrás - ezt Operation egy elem hozzáadására szolgál a hash táblához
  • Kutató - ezt Operation segítségével kereshet elemeket a hash táblában a kulcs segítségével
  • törlése - ezt Operation elemekkel törölhető a hash táblából

Adatbeviteli művelet

A beszúrási művelet az értékek tárolására szolgál a hash táblában. Ha új értéket tárol a hash táblában, akkor indexszámot kap. Az indexszám kiszámítása a hash függvény segítségével történik. A hash függvény felold minden ütközést, amely az indexszám kiszámításakor fordul elő.

Adatművelet keresése

A keresési művelet a hash táblában lévő értékek megkeresésére szolgál az indexszám segítségével. A keresési művelet azt az értéket adja vissza, amely a keresési indexszámhoz van kapcsolva. Például, ha a 6-os értéket a 2-es indexen tároljuk, a 2-es indexszámú keresési művelet a 6-os értéket adja vissza.

Adatok törlése művelet

A törlési művelet egy érték eltávolítására szolgál egy hash táblából. Törölni a Operaaz indexszám használatával történik. Az érték törlése után az indexszám szabaddá válik. Más értékek tárolására használható a beszúrási művelet segítségével.

Hash tábla megvalósítása Python Példa

Nézzünk egy egyszerű példát, amely kiszámítja a kulcs hash értékét

def hash_key( key, m):
    return key % m


m = 7

print(f'The hash value for 3 is {hash_key(3,m)}')
print(f'The hash value for 2 is {hash_key(2,m)}')
print(f'The hash value for 9 is {hash_key(9,m)}')
print(f'The hash value for 11 is {hash_key(11,m)}')
print(f'The hash value for 7 is {hash_key(7,m)}')

Hash táblázat Code Magyarázat

Hash táblázat Code Magyarázat

ITT,

  1. Hash_key függvényt határoz meg, amely elfogadja a kulcs és m paramétereket.
  2. Egy egyszerű modulus műveletet használ a hash érték meghatározásához
  3. Meghatároz egy m változót, amely 7-es értékre inicializálódik. Ez a hash táblánk mérete
  4. Kiszámolja és kiírja a 3-as hash értékét
  5. Kiszámolja és kiírja a 2-as hash értékét
  6. Kiszámolja és kiírja a 9-as hash értékét
  7. Kiszámolja és kiírja a 11-as hash értékét
  8. Kiszámolja és kiírja a 7-as hash értékét

A fenti kód végrehajtása a következő eredményeket produkálja.

The hash value for 3 is 3
The hash value for 2 is 2
The hash value for 9 is 2
The hash value for 11 is 4
The hash value for 7 is 0

Python Példa szótárhoz

Python egy szótár nevű beépített adattípussal érkezik. A szótár egy példa a hash-táblázatra. Az értékeket kulcs- és értékpár segítségével tárolja. A hash értékek automatikusan generálódnak számunkra, és az esetleges ütközéseket a rendszer a háttérben oldja meg helyettünk.

A következő példa bemutatja, hogyan használhat szótári adattípust Python 3

employee = {
    'name': 'John Doe',
    'age': 36,
    'position': 'Business Manager.'
}

print (f"The name of the employee is {employee['name']}")
employee['position'] = 'Software Engineer'
print (f"The position of {employee['name']} is {employee['position']}")
employee.clear()

print (employee)

Python Példa szótárhoz

ITT,

  1. Egy szótári változót határoz meg. A kulcsnév a John Doe érték tárolására szolgál, az életkor 36 évet, a pozíció pedig a Business Manager értéket tárolja.
  2. Lekéri a kulcsnév értékét, és kiírja a terminálba
  3. Frissíti a kulcspozíció értékét a Szoftvermérnök értékre
  4. Kinyomtatja a billentyűk nevének és pozíciójának értékeit
  5. Törli az alkalmazott szótárváltozóban tárolt összes értéket
  6. Kiírja az alkalmazott értékét

A fenti kód futtatása a következő eredményeket produkálja.

The name of the employee is John Doe.
The position of John Doe is a Software Engineer.
{}

Komplexitás elemzése

A hash táblák átlagos időbonyolultsága O (1) a legjobb forgatókönyv szerint. A legrosszabb eset bonyolultsága O(n). A legrosszabb forgatókönyv akkor fordul elő, ha sok érték generálja ugyanazt a hash kulcsot, és az ütközést vizsgálással kell megoldanunk.

Valós alkalmazások

A valós világban hash táblákat használnak az adatok tárolására

  • Adatbázisok
  • Asszociatív tömbök
  • Szettek
  • Memória gyorsítótár

A hash táblák előnyei

Íme a hash táblák használatának előnyei/előnyei:

  • A hash-táblázatok nagy teljesítményt nyújtanak az adatok keresésekor, a meglévő értékek beszúrásakor és törlésekor.
  • A hash táblák időbonyolultsága állandó, függetlenül a táblázat elemeinek számától.
  • Nagyon jól teljesítenek még akkor is, ha nagy adatkészletekkel dolgoznak.

A hash táblák hátrányai

Íme a hash táblák használatának hátrányai:

  • Nem használhat null értéket kulcsként.
  • Az ütközések nem kerülhetők el kulcsok generálásakor. hash függvények. Ütközés akkor következik be, amikor egy már használatban lévő kulcs generálódik.
  • Ha a kivonatoló függvénynek sok ütközése van, ez a teljesítmény csökkenéséhez vezethet.

GYIK

Egy tömb szekvenciális egész indexeket használ, tehát egy elem érték szerinti megtalálása szkennelést jelent. Egy hash tábla bármely kulcsot egy indexhez rendel egy hash függvényen keresztül, átlagosan O(1) keresést, beszúrást és törlést eredményezve a mérettől függetlenül.

A terhelési tényező a tárolt bejegyzések és a hash tábla összes résszámának aránya. A magas terhelési tényező növeli az ütközéseket és lelassítja a műveleteket, ezért sok implementáció átméretezi és újra hasheli a táblázatot, amint a terhelési tényező átlép egy küszöbértéket.

A láncolás az ütköző kulcsokat láncolt listákban tárolja minden egyes mezőben, így a tábla több elemet tud tárolni, mint mezőt. A nyílt címzés (próbázás) az összes bejegyzést a tömbön belül tartja, és a következő szabad mezőt keresi. A láncolás jobban kezeli a nagy terhelést.

A hashelés a mesterséges intelligenciát a jellemzőhashelés, vagy hashelési trükk segítségével támogatja, amely nagy szövegeket vagy kategorikus jellemzőket képez le egy fix méretű vektorba. Ez memóriát takarít meg és felgyorsítja a betanítást, bár a hash ütközések különböző jellemzőket egyesíthetnek.

Igen. A mesterséges intelligencia javasolhat hash függvények terveit, tesztelheti azokat egyenletes eloszlásra, és becsülheti meg az ütközési arányokat a mintaadatokon. Segít összehasonlítani a lehetőségeket, de a függvényt a valós munkaterhelésen is érdemes összehasonlítani, mielőtt bevezetnénk.

Foglald össze ezt a bejegyzést a következőképpen: