Junior
Pasakok apie maišos lenteles ir jų pagrindinį veikimo principą.
sobes.tech AI
Atsakymas iš AI
Žemės-lauko lentelė (hash-map) yra duomenų struktūra, įgyvendinanti asociatyvų masyvą ir susiejanti raktus su reikšmėmis.
Pagrindinis darbo principas:
- Hashavimas: Kiekvienam raktui apskaičiuojamas hash kodas — skaitinė reikšmė, naudojant hash funkciją. Gera hash funkcija tolygiai paskirsto hash kodus visame išėjimo diapazone.
- Indeksavimas: Apskaičiuotas hash kodas naudojamas indeksui (pozicijai) masyve nustatyti, kur bus saugoma atitinkama reikšmė. Dažnai hash kodas imamas moduliu iš masyvo dydžio (
hash(key) % array_size), gaunant galutinį indeksą. - Saugojimas: Masyve pagal apskaičiuotą indeksą saugomas (raktas, reikšmė) pora.
- Paieška: Norint rasti reikšmę pagal raktą, vėl apskaičiuojamas rakto hash kodas, nustatomas indeksas, ir iš šio indekso išgaunama reikšmė.
- Kolizijos: Atsiranda, kai skirtingi raktai turi tą patį hash kodą. Yra įvairių metodų kolizijoms spręsti:
- Atskirų grandinių metodas (Separate Chaining): Kiekviename masyvo indekse saugomas sąrašas (ar kita duomenų struktūra), kuriame yra visi (raktas, reikšmė) poros, kurių hash kodai nulėmė tą indeksą.
- Atvirosios adresacijos metodas (Open Addressing): Kolizijos atveju ieškoma kitos laisvos vietos masyve pagal tam tikrą taisyklę (tiesinė sondavimas, kvadratinis sondavimas, dvigubas hashavimas).
Privalumai:
- Vidutiniškai įterpimo, ištrynimo ir paieškos operacijos turi sudėtingumą O(1), jei hash funkcija gera ir kolizijos retos.
Trūkumai:
- Blogiausiu atveju našumas gali būti O(n), jei visi raktai yra hash'inami į tą patį indeksą (pavyzdžiui, blogos hash funkcijos ar didelio kolizijų skaičiaus atveju).
- Reikalinga papildoma atmintis masyvui ir galbūt kolizijų sprendimui.
Swift kalboje hash-lentelės įgyvendintos Dictionary tipu:
// Pavyzdys, kaip naudoti Dictionary Swift kalboje
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]
// Prieiga per raktą
let value = myDictionary["banana"] // Gauna Optional(2)
// Pridėjimas/atnaujinimas
myDictionary["grape"] = 4 // Prideda naują porą
myDictionary["apple"] = 10 // Atnaujina reikšmę "apple" raktui
// Ištrynimas
myDictionary["orange"] = nil // Ištrina "orange" porą