Middle
Ինչպես է կառուցված hash-թերթը unordered_map կոնտեյներում?
sobes.tech AI
Պատասխան AI-ից
unordered_map C++-ի մեջ իրականացվում է որպես հեշ-թերթ:
Աշխատանքի սկզբունք:
- Հեշավորում: Կլիչը փոխարկվում է ամբողջ թիվ՝ հեշ-կոդ՝ հեշ-ֆունկցիայի միջոցով:
- Ինդեքսավորում: Հեշ-կոդը օգտագործվում է որոշելու համար ինդեքսը (խցիկը կամ բաքը) ցուցակի կամ ցուցակների զանգվածում:
- Պահպանում: Յուրաքանչյուր խցիկում պահվում են բանալին-արժեք զույգեր:
Հատկություններ:
- Խցիկներ: Հեշ-թերթը բաղկացած է խցիկների զանգվածից: Խցիկների քանակը կարող է դինամիկ փոխվել (վերահաշվարկ) որոշակի բեռնման գործակիցին հասնելիս:
- Կոլիզիաներ: Տարբեր բանալիները կարող են տալ նույն հեշ-կոդը: Սա կոչվում է կոլիզիա: Կոլիզիաները լուծելու համար
unordered_map-ում օգտագործվում է շղթայման (chaining) մեթոդը՝ նույն հեշով տարրերը ավելացվում են կապված ցանկում կամ այլ տվյալների կառուցվածքում: - Հեշ-ֆունկցիա և համեմատության ֆունկցիա: Ճիշտ աշխատանքի համար անհրաժեշտ են երկու բան.
- Լավ հեշ-ֆունկցիա, որը հավասարաչափ տարածում է բանալիները խցիկների միջև՝ նվազեցնելով կոլիզիաները:
- Համեմատության ֆունկցիա (
==օպերատոր), որը տարբերում է նույն հեշ-կոդով բանալիները:
- Արդյունավետություն: Միջինում, ավելացման, հեռացման և որոնման գործողությունները ունեն ժամանակային բարդություն O(1): վատագույն դեպքում (օրինակ, շատ կոլիզիաներ կամ վատ ընտրված հեշ-ֆունկցիա) կարող է դեգրադացնել մինչև O(n), որտեղ n՝ տարրերի քանակը:
Նմուշային կառուցվածք (պարզեցված):
struct Node {
KeyType key;
ValueType value;
Node* next; // Կապված ցանկի համար
};
struct Bucket {
Node* head; // Ցուցակ սկսելու համար
};
Bucket* buckets; // Խցիկների զանգված
size_t num_buckets;
Ավելացման գործընթաց:
- Հաշվարկվում է բանալիի հեշ-կոդը:
- Որոշվում է խցիկի ինդեքսը՝
bucket_index = hash(key) % num_buckets: - Բանալի-արժեք զույգը ավելացվում է այդ խցիկի ցանկում: Եթե բանալին արդեն կա, արժեքը թարմացվում է:
Որոնման գործընթաց:
- Հաշվարկվում է բանալիի հեշ-կոդը:
- Որոշվում է խցիկի ինդեքսը:
- Գնահատվում է այդ խցիկի ցանկը՝ համեմատելով բանալիները
==օպերատորով:
Վերահաշվարկը կատարվում է, երբ տարրերի քանակը գերազանցում է սահմանված շեմը (load factor): Այդ ժամանակ ստեղծվում է նոր, մեծածավալ զանգված և բոլոր տարրերը վերահաշվարկվում և տեղափոխվում նոր խցիկներ։