Sobes.tech
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:

  1. Kovalar (sepetlər) massivləri — əsas konteyner elementləri saxlamaq üçün.
  2. Hash funksiyası — açarı massiv indeksinə çevirir.
  3. 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) жакын камсыз кылат.