Junior
Хэш таблицалары жана алардын негизги иштөө принциби жөнүндө айтып бер.
sobes.tech AI
AIден жооп
Хеш-таблица (хеш-мап) — бул маалыматтардын структурасы, ал ассоциативдүү массивди ишке ашырып, ачкычтарды маанилерге көрсөтөт.
Негизги иштөө принциби:
- Хештөө: Ар бир ачкыч үчүн хеш-код эсептелет — хеш-функция аркылуу белгилүү өлчөмдөгү сандык мааниге ээ болот. Жакшы хеш-функция хеш-коддорду чыгаруу диапазонун тең бөлүштүрөт.
- Индекстеүү: Эсептелген хеш-код массивдеги индексти (орунду) аныктоо үчүн колдонулат, анда тиешелүү мааниде сакталат. Көп учурда хеш-код массивдин өлчөмүнө бөлүнгөндө (
hash(key) % array_size) алынган индекс акыркы болот. - Сактоо: Эсептелген индекс боюнча массивде (ачкыч, мааниси) экилиги сакталат.
- Издөө: Ачкыч боюнча маанини табуу үчүн, кайрадан ачкычтын хеш-коды эсептелет, индекс аныкталат жана ошол индекс аркылуу мааниге жеткирилет.
- Коллизиялар: Түзүлөт, эгерде ар кандай ачкычтар бирдей хеш-кодго ээ болсо. Коллизияларды чечүү үчүн ар кандай ыкмалар бар:
- Өзүнчө чынжыр (Separate Chaining): Ар бир массив индексинде тизмек (же башка структура) сакталат, ал бардык (ачкыч, мааниси) экиликтерин камтыйт, алардын хеш-коддору ушул индекске алып келген.
- Ачык дарек (Open Addressing): Коллизия пайда болгондо, башка бош орун издөө белгилүү эрежеге ылайык жүргүзүлөт (сызыктуу издөө, квадратик издөө, эки жолу хештөө).
Артыкчылыктары:
- Орто эсеп менен кошуу, өчүрүү жана издөө операциялары O(1) татаалдыгы менен иштейт, эгер хеш-функция жакшы болсо жана коллизиялар сейрек болсо.
Кемчиликтери:
- Эң жаман учурларда иштөө ылдамдыгы O(n) болушу мүмкүн, эгер бардык ачкычтар бирдей индекске хештелсе (жаман хеш-функция же көп коллизиялар болсо).
- Кошумча эс тутум талап кылынат, массив жана коллизияларды чечүү үчүн.
Swift тилинде хеш-таблицалар Dictionary түрү менен ишке ашырылат:
// Swiftте Dictionary колдонуу мисалы
var myDictionary: [String: Int] = ["apple": 1, "banana": 2, "orange": 3]
// Ачкыч аркылуу кирүү
let value = myDictionary["banana"] // Optional(2) алат
// Кошуу/жаңылоо
myDictionary["grape"] = 4 // Жаңы экилик кошот
myDictionary["apple"] = 10 // "apple" үчүн маанини жаңылат
// Өчүрүү
myDictionary["orange"] = nil // "orange" экилигин өчүрөт