[c++] 해시 테이블 충돌 해결 방법

1. 개별 연결법 (Separate Chaining)

이 방법은 각 해시 버킷당 연결 리스트를 사용하여 충돌을 해결합니다. 해시 값이 동일한 원소는 같은 버킷에 연결 리스트를 통해 연결됩니다. 삽입 및 검색 시간은 리스트의 길이에 비례하여 증가할 수 있지만, 메모리를 효율적으로 사용할 수 있습니다.

#include <iostream>
#include <list>
#include <vector>

class HashTable {
private:
    int size;
    std::vector<std::list<int>> table;

public:
    HashTable(int size) : size(size), table(size) {}

    void insert(int key) {
        int index = key % size;
        table[index].push_back(key);
    }

    bool search(int key) {
        int index = key % size;
        for (int elem : table[index]) {
            if (elem == key) {
                return true;
            }
        }
        return false;
    }
};

int main() {
    HashTable ht(5);
    ht.insert(5);
    ht.insert(10);
    std::cout << ht.search(5) << std::endl;  // Output: 1
    std::cout << ht.search(8) << std::endl;  // Output: 0
    return 0;
}

2. 오픈 주소법 (Open Addressing)

이 방법은 충돌이 발생한 경우, 다른 버킷에 비어있는 공간을 찾아 데이터를 삽입하는 방식입니다. 선형 탐사, 이차원 탐사, 이중 해싱 등이 사용될 수 있습니다.

#include <iostream>
#include <vector>

class HashTable {
private:
    int size;
    std::vector<int> table;

public:
    HashTable(int size) : size(size), table(size, -1) {}

    void insert(int key) {
        int index = key % size;
        while (table[index] != -1) {
            index = (index + 1) % size;
        }
        table[index] = key;
    }

    bool search(int key) {
        int index = key % size;
        int originalIndex = index;
        while (table[index] != -1) {
            if (table[index] == key) {
                return true;
            }
            index = (index + 1) % size;
            if (index == originalIndex) {
                break;
            }
        }
        return false;
    }
};

int main() {
    HashTable ht(5);
    ht.insert(5);
    ht.insert(10);
    std::cout << ht.search(5) << std::endl;  // Output: 1
    std::cout << ht.search(8) << std::endl;  // Output: 0
    return 0;
}

더 많은 정보를 원하시면 해시 테이블 충돌 해결을 참고하세요.