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" զույգը