Junior — Middle
როგორ დაგეგმავდით მონაცემთა სტრუქტურას სწრაფი ძიებისთვის გასაღებით ჰეშფუნქციის გამოყენებით?
sobes.tech AI
პასუხი AI-სგან
Hash funksiyası vasitəsilə açar üzrə sürətli axtarış üçün adətən məlumat quruluşu — hash cədvəli (hash table) istifadə olunur. Dizaynın əsas elementləri:
- Kovalar (sepetlər) massivləri — əsas konteyner elementləri saxlamaq üçün.
- Hash funksiyası — açarı massiv indeksinə çevirir.
- Kolliziyaların idarə olunması — iki açar eyni indeks verdikdə.
Kolliziyaların idarə olunmasının nümunəsi:
- Zəncirləmə (chaining): hər sepetdə eyni indeksə malik elementlərin əlaqəli siyahısı saxlanılır.
- Açıq ünvanlama (open addressing): kolliziya zamanı növbəti boş hüceyrə axtarılır.
C++-də zəncirləmə ilə nümunə:
#include <vector>
#include <list>
#include <string>
class HashTable {
static const int SIZE = 100;
std::vector<std::list<std::pair<std::string, int>>> table;
int hash(const std::string& key) {
int hashVal = 0;
for (char c : key) {
hashVal = (hashVal * 31 + c) % SIZE;
}
return hashVal;
}
public:
HashTable() : table(SIZE) {}
void insert(const std::string& key, int value) {
int idx = hash(key);
for (auto& kv : table[idx]) {
if (kv.first == key) {
kv.second = value; // yeniləmə
return;
}
}
table[idx].emplace_back(key, value);
}
bool find(const std::string& key, int& value) {
int idx = hash(key);
for (auto& kv : table[idx]) {
if (kv.first == key) {
value = kv.second; // qiymət
return true;
}
}
return false;
}
};
Бул ыкма орто эсеп менен издөө убактысын O(1) жакын камсыз кылат.