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