Junior
Mi az a hash-tábla?
sobes.tech MI
Válasz az MI-től
A hash-tábla, vagy asszociatív tömb, egy olyan adatszerkezet, amely az asszociatív tömb felületét valósítja meg, azaz kulcsokat köt össze értékekkel. Hash függvényt használ az index, vagy "hash" kiszámítására, ahol a keresett értéknek lennie kell.
Fő összetevők:
- Kulcs: Az elem egyedi azonosítója.
- Érték: A kulccsal összekapcsolt adatok.
- Hash függvény: A kulcsot numerikus értékké (hash) alakítja, amelyet az index meghatározására használnak.
- Kosarak (Buckets): Egy tömb, ahol a kulcs-érték párokat tárolják.
- Ütközéskezelés (Collision Handling): Olyan mechanizmus, amely megoldja azokat a helyzeteket, amikor különböző kulcsok ugyanarra a hash értékre adnak, és így ugyanarra a kosárra mutatnak. Gyakori módszerek:
- Láncolási módszer (Chaining): Minden kosárban egy lista (pl. összekapcsolt lista) tárolja azokat az elemeket, amelyek hash értéke erre a kosárra mutat.
- Nyitott címzéses módszer (Open Addressing): Ütközés esetén a következő szabad kosarat keresi lineáris, kvadratikus vagy kettős hash-elés algoritmusok segítségével.
Működési elv:
- Beszúrás: A hash függvényt alkalmazzuk a kulcsra, hogy hash értéket kapjunk. A hash érték alapján határozzuk meg a kosár indexét. A kulcs-érték pár ebbe a kosárba kerül. Ütközés esetén alkalmazzuk az ütközéskezelő módszert.
// Példa elem beszúrására hash-táblába (láncolási módszer) function insert(key, value) { const hash = hashFunction(key); // Hash számítása const bucketIndex = hash % tableSize; // Kosár indexének meghatározása if (!buckets[bucketIndex]) { buckets[bucketIndex] = []; // Lista létrehozása, ha nem létezik } buckets[bucketIndex].push({ key, value }); // Pár hozzáadása a listához } - Keresés: A hash függvényt alkalmazzuk a kulcsra, hogy hash értéket kapjunk. A hash alapján meghatározzuk a kosár indexét. Ezután ebben a kosárban keresünk a megadott kulccsal. Láncolási módszernél a lista belsejében keresünk. Nyitott címzés esetén egymás után ellenőrizzük a többi kosarat, amíg meg nem találjuk a keresett elemet vagy meg nem állapítjuk annak hiányát.
// Példa elem keresésére hash-táblában (láncolási módszer) function searchAndDelete(key) { const hash = hashFunction(key); // Hash számítása const bucketIndex = hash % tableSize; // Kosár indexének meghatározása if (buckets[bucketIndex]) { // Elem keresése a kosár listájában for (let i = 0; i < buckets[bucketIndex].length; i++) { if (buckets[bucketIndex][i].key === key) { const value = buckets[bucketIndex][i].value; // buckets[bucketIndex].splice(i, 1); // Ha törlés szükséges return value; // Érték visszaadása } } } return undefined; // Elem nem található }
Előnyök:
- Magas sebesség az beszúrás, keresés és törlés műveletekben átlagosan (O(1)).
- Hatékony memóriahasználat a közvetlen hozzáférésű tömbhöz képest (ha a kulcsok ritkán oszlanak el).
Hátrányok:
- A teljesítmény romolhat sok ütközés esetén (rosszabb esetben O(n)).
- Nem őrzi meg az elemek beszúrási sorrendjét.
- Jó hash függvény szükséges a kulcsok egyenletes eloszlásához.