Junior
Pověz o hash tabulkách a jejich základním principu fungování.
sobes.tech AI
Odpověď od AI
Hash tabulka (hash mapa) je datová struktura, která implementuje asociativní pole, mapující klíče na hodnoty.
Princip fungování:
- Hashování: Pro každý klíč se vypočítá hash kód — číselná hodnota pevné velikosti pomocí hash funkce. Dobrá hash funkce rovnoměrně rozděluje hash kódy po celém rozsahu výstupů.
- Indexování: Vypočítaný hash kód se používá k určení indexu (pozice) v poli, kde bude uložen odpovídající hodnotu. Často
hash(key) % velikost_poledává finální index. - Uložení: V poli se na vypočítaném indexu uloží pár (klíč, hodnota).
- Vyhledávání: Pro nalezení hodnoty podle klíče se znovu vypočítá hash kód klíče, určí se index a z tohoto indexu se extrahuje hodnota.
- Kolize: Vznikají, když různé klíče mají stejný hash kód. Existují různé metody řešení kolizí:
- Metoda řetězení (Separate Chaining): Na každý index pole se udržuje seznam (nebo jiná datová struktura), obsahující všechny páry (klíč, hodnota), jejichž hash kódy vedly k tomuto indexu.
- Metoda otevřeného adresování (Open Addressing): Při kolizi se hledá jiné volné místo v poli podle určitého pravidla (lineární sondování, kvadratické sondování, dvojité hashování).
Výhody:
- Průměrně operace vkládání, mazání a hledání mají složitost O(1), pokud je hash funkce dobrá a kolize jsou vzácné.
Nevýhody:
- Nejhorší případ výkonu může být O(n), pokud jsou všechny klíče hashovány do stejného indexu (například při špatné hash funkci nebo velkém počtu kolizí).
- Vyžaduje dodatečnou paměť pro pole a možná i pro řešení kolizí.
V Swift jsou hash tabulky implementovány typem Dictionary.
// Příklad použití Dictionary ve Swift
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]
// Přístup přes klíč
let value = myDictionary["banana"] // Získá Optional(2)
// Přidání/aktualizace
myDictionary["grape"] = 4 // Přidá nový pár
myDictionary["apple"] = 10 // Aktualizuje hodnotu pro klíč "apple"
// Odstranění
myDictionary["orange"] = nil // Odstraní pár s klíčem "orange"