Sobes.tech
Junior

Хэш таблицалары жана алардын негизги иштөө принциби жөнүндө айтып бер.

sobes.tech AI

AIден жооп

Хеш-таблица (хеш-мап) — бул маалыматтардын структурасы, ал ассоциативдүү массивди ишке ашырып, ачкычтарды маанилерге көрсөтөт.

Негизги иштөө принциби:

  1. Хештөө: Ар бир ачкыч үчүн хеш-код эсептелет — хеш-функция аркылуу белгилүү өлчөмдөгү сандык мааниге ээ болот. Жакшы хеш-функция хеш-коддорду чыгаруу диапазонун тең бөлүштүрөт.
  2. Индекстеүү: Эсептелген хеш-код массивдеги индексти (орунду) аныктоо үчүн колдонулат, анда тиешелүү мааниде сакталат. Көп учурда хеш-код массивдин өлчөмүнө бөлүнгөндө (hash(key) % array_size) алынган индекс акыркы болот.
  3. Сактоо: Эсептелген индекс боюнча массивде (ачкыч, мааниси) экилиги сакталат.
  4. Издөө: Ачкыч боюнча маанини табуу үчүн, кайрадан ачкычтын хеш-коды эсептелет, индекс аныкталат жана ошол индекс аркылуу мааниге жеткирилет.
  5. Коллизиялар: Түзүлөт, эгерде ар кандай ачкычтар бирдей хеш-кодго ээ болсо. Коллизияларды чечүү үчүн ар кандай ыкмалар бар:
    • Өзүнчө чынжыр (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" экилигин өчүрөт