Junior
Hash jadvallar va ularning asosiy ishlash prinsipi haqida gapiring.
sobes.tech AI
AIdan javob
Hash jadvali (hash xaritasi) — bu kalitlarni qiymatlarga xaritlaydigan ma'lumotlar tuzilmasi bo'lib, assotsiativ massivni amalga oshiradi.
Ishlash prinsipi:
- Hashlash: Har bir kalit uchun, hash-kod hisoblanadi — hash funktsiyasi yordamida belgilangan o'lchamdagi raqamli qiymat. Yaxshi hash funktsiyasi hash-kodlarni chiqish diapazonida teng taqsimlaydi.
- Indeksatsiya: Hisoblangan hash-kod, mos keladigan qiymat saqlanadigan massivdagi indeksni (joyni) aniqlash uchun ishlatiladi. Ko'pincha,
hash(key) % array_sizeyakuniy indeksni beradi. - Saqlash: Massivda, hisoblangan indeksda, (kalit, qiymat) jufti saqlanadi.
- Qidiruv: Kalit bo'yicha qiymatni topish uchun, kalitning hash-kodi yana hisoblanadi, indeks aniqlanadi va shu indeksdan qiymat olinadi.
- Koliziyalar: Turli kalitlar bir xil hash-kodga ega bo'lsa, yuzaga keladi. Koliziyalarni hal qilish uchun turli usullar mavjud:
- Kuchli usul (Separate Chaining): Har bir massiv indeksida, u indeksga keladigan barcha (kalit, qiymat) juftlarini o'z ichiga olgan ro'yxat (yoki boshqa ma'lumotlar tuzilmasi) saqlanadi.
- Ochiq manzil (Open Addressing): Koliziya yuzaga kelganda, ma'lum bir qoidaga muvofiq, massivda boshqa bo'sh joy qidiriladi (chiziqli sondirish, kvadrat sondirish, ikki marta hash qilish).
Afzalliklari:
- O'rtacha, qo'shish, o'chirish va qidiruv operatsiyalari O(1) murakkablikda bo'ladi, agar hash funktsiyasi yaxshi va koliziyalar kam bo'lsa.
Kamchiliklari:
- Eng yomon holatda, ishlash tezligi O(n) bo'lishi mumkin, agar barcha kalitlar bir xil indeksga hashlangan bo'lsa (masalan, yomon hash funktsiyasi yoki ko'p koliziyalar bilan).
- Qo'shimcha xotira talab qilinadi, massiv va ehtimol, koliziyalarni hal qilish uchun.
Swiftda, hash jadvallari Dictionary turi bilan amalga oshiriladi.
// Swiftda Dictionary misoli
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]
// Kalit bilan kirish
let value = myDictionary["banana"] // Optional(2) oladi
// Qo'shish/yangilash
myDictionary["grape"] = 4 // Yangi juft qo'shadi
myDictionary["apple"] = 10 // "apple" kaliti uchun qiymatni yangilaydi
// O'chirish
myDictionary["orange"] = nil // "orange" kalitli juftni o'chiradi