Junior
Ինչպես է աշխատում հեշ-թերթը?
sobes.tech AI
Պատասխան AI-ից
Հեշ-թերթ (hash table) — դա տվյալների կառուցվածք է, որը իրականացնում է ասոցատիվ զանգված:
Աշխատանքի սկզբունքը՝
- Հեշավորում։ Յուրաքանչյուր բանալի (key) համար հաշվարկվում է հեշ-կոդ (hash code) հեշ-ֆունկցիայի (hash function) միջոցով։ Հեշ-կոդը ամբողջ թիվ է։
- Ինդեքսավորում։ Հեշ-կոդը օգտագործվում է որոշելու ինդեքսը (index) ներսի կառուցվածքի զանգվածում (կամ վեկտորում)։ Սովորաբար ինդեքսը հաշվարկվում է որպես
hash_code % array_size, որտեղarray_sizeզանգվածի չափն է։ - Պահպանում։ Հետազոտվող ինդեքսում պահվում է բանալիին (key) կապված արժեքը (value)։
Պրոբլեմներ և դրանց լուծումներ՝
- Կոլիզիաներ։ Տարբեր բանալիներ կարող են տալ նույն հեշ-կոդը և, հետևաբար, նույն ինդեքսը։ Սա կոչվում է կոլիզիա։
- Լուծման մեթոդներ՝
- Արձագանքների շղթայակապում (Separate Chaining)։ Յուրաքանչյուր զանգվածի բջիջում պահվում է ցանկ (կամ վեկտոր) "բանալի-արժեք" զույգերի։ Կոլիզիայի դեպքում նոր զույգը ավելացվում է այդ ցանկին։ Հետազոտության ժամանակ, համապատասխան ցանկը դիտվում է՝ գտնելու համար անհրաժեշտ բանալին։
- Բաց հասցեագրման մեթոդ (Open Addressing)։ Կոլիզիայի դեպքում որոնվում է այլ ազատ բջիջ զանգվածում որոշակի կանոնով (փորձարկումով)։
- Գծային փորձարկում (Linear Probing)։ Հետեւաբար, ստուգվում են բջիջները
index + 1,index + 2և այլն, մոդուլով զանգվածի չափի։ - Կուադրատիկ փորձարկում (Quadratic Probing)։ Ստուգվում են բջիջները
index + 1^2,index + 2^2և այլն, մոդուլով զանգվածի չափի։ - Երկակի հեշավորում (Double Hashing)։ Երկրորդ հեշ-ֆունկցիան օգտագործվում է փորձարկման քայլը որոշելու համար։
- Գծային փորձարկում (Linear Probing)։ Հետեւաբար, ստուգվում են բջիջները
- Լուծման մեթոդներ՝
Առավելություններ՝
- Միջինում, ներմուծման, հեռացման և որոնման գործողությունները կատարվում են O(1) բարդությամբ։
Անբավարարություններ՝
- Ամենավատ դեպքերում (օրինակ, շատ կոլիզիաների կամ վատ հեշ-ֆունկցիայի դեպքում) գործողությունների բարդությունը կարող է հասնել O(n), որտեղ n տարրերի քանակն է։
- Պահանջում է լրացուցիչ հիշողություն (օրինակ, ցանկերի համար շղթայակապման մեթոդում կամ փորձարկման համար բաց հասցեագրման մեթոդում)։
Օրինակ՝ C++-ում օգտագործելու համար (std::unordered_map):
#include <unordered_map>
#include <string>
#include <iostream>
int main() {
// Հաշվարկային աղյուսակի ստեղծում (unordered_map)
std::unordered_map<std::string, int> տարի;
// Էլեմենտների ավելացում
տարի["Alice"] = 30;
տարի["Bob"] = 25;
տարի["Charlie"] = 35;
// Արժեք ստանալ բանալիով
std::cout << "Alice-ի տարիքը՝ " << տարի["Alice"] << std::endl;
// Էլեմենտի որոնում
if (տարի.count("Bob")) {
std::cout << "Bob-ը կա քարտեզում։" << std::endl;
}
// Էլեմենտի հեռացում
տարի.erase("Charlie");
return 0;
}