Чӣ гуна метавон ҳалли коллизияҳои хешро кард?
sobes.tech AI
Ҷавоб аз AI
-
Равандиҳо (Separate Chaining):
- Ҳар як унсури коди хеш (бакет) ишора ба рӯйхати пайвастшуда (ё дигар сохтори додаҳо, масалан, дарахт) мебошад.
- Ҳамаи унсурҳое, ки ба як бакет хеш шудаанд, ба ин рӯйхат илова карда мешаванд.
// Намуна: нод барои рӯйхати пайвастшуда барои равандҳо struct Node { int key; int value; Node* next; }; // Дар бакет ишора ба сарлавҳаи рӯйхат нигоҳ дошта мешавад Node* buckets[TABLE_SIZE]; -
Методҳои суръатнокии кушод (Open Addressing):
- Ҳамаи унсурҳо мустақиман дар массиви хештабл ҷойгир мешаванд.
- Дар ҳолати колизия, ҷустуҷӯи ҷойи озод дар массив анҷом дода мешавад.
- Ин методҳо аз рӯи усули муайян кардани ҷойи оянда фарқ мекунанд:
-
Пробиравии хаттӣ (Linear Probing): Блокҳо дар тартиб бо қадам муайян санҷида мешаванд
i, i+1, i+2, ... mod TABLE_SIZE.// Намунаи пробиравии хаттӣ int hash(int key) { return key % TABLE_SIZE; } int i = hash(key); while (table[i] != EMPTY && table[i].key != key) { i = (i + 1) % TABLE_SIZE; } // Ҳоло table[i] ё холӣ аст ё унсури ҷустуҷӯӣ -
Пробиравии квадратики (Quadratic Probing): Блокҳо бо қадами вобаста ба квадрати кӯшишҳо санҷида мешаванд
i, i+1², i+2², ... mod TABLE_SIZE.// Намунаи пробиравии квадратики int hash(int key) { return key % TABLE_SIZE; } int i = hash(key); int attempt = 0; while (table[i] != EMPTY && table[i].key != key && attempt < TABLE_SIZE) { attempt++; i = (hash(key) + attempt * attempt) % TABLE_SIZE; } // Ҳоло table[i] ё холӣ аст ё унсури ҷустуҷӯӣ (ё таблица пур шудааст) -
Дугона хеш (Double Hashing): Истифодаи функсияи дуввумии хеш барои муайян кардани қадами кӯшиш
i, i + step, i + 2*step, ... mod TABLE_SIZE, киstepаз функсияи дуввумии хеши кључ ҳисоб карда мешавад.// Намунаи дугона хеш int hash1(int key) { return key % TABLE_SIZE; } int hash2(int key) { return 1 + (key % (TABLE_SIZE - 1)); } int i = hash1(key); int step = hash2(key); while (table[i] != EMPTY && table[i].key != key) { i = (i + step) % TABLE_SIZE; } // Ҳоло table[i] ё холӣ аст ё унсури ҷустуҷӯӣ
-
-
Тақвимоти тағйирёбанда (Resizing):
- Вақте ки нишондиҳандаи боркунӣ (load factor) ба сатҳи муайян мерасад, таблицаи нав бо андозаи калонтар сохта мешавад.
- Ҳамаи унсурҳо аз таблицаи кӯҳна дубора хеш карда мешаванд ва ба таблицаи нав дохил карда мешаванд.
// Намунаи логикаи resize if (current_size / (double)table_size > max_load_factor) { // Таҳия кардани таблицаи нав бо ду баробар ё бештар аз ду маротиба калонтар // Дубора хеш кардан ва дохил кардани ҳамаи унсурҳо аз таблицаи кӯҳна // Баъд аз он таблицаи кӯҳнаро тоза кардан }
Интихоби усул аз талаботҳои ба иҷроиш, хотира, мураккабии татбиқ ва интизоршавандаи коефициентҳои боркунӣ вобаста аст. Методҳои ланҷар одатан соддатар ва дар ҳолатҳои баландии боркунӣ хуб кор мекунанд, аммо ба хотираи иловагӣ барои ишораҳо ниёз доранд. Методҳои кушодии суръатнокӣ метавонанд хотираро самараноктар истифода баранд, аммо ба интихоби функсияи хеш ва мушкилоти "мавҷгирӣ" бештар ҳассосанд. Resize барои нигоҳ доштани самаранокӣ дар ҳангоми афзоиши шумораи унсурҳо зарур аст.