더북(TheBook)

  7. 삽입은 재귀적으로 동작해야 하기 때문에 실제 삽입 구현 함수를 따로 만들겠습니다. 삽입 함수에서는 순환 여부를 검사해야 합니다. 그러나 방문한 위치의 모든 값을 기억하는 것은 부담이 클 수 있습니다. 그러므로 여기서는 단순히 재귀 호출 횟수가 몇 회 이상이 되면 순환으로 간주하겠습니다. 이때 최대 재귀 호출 횟수는 해시 테이블 크기와 같게 설정할 것이며, 이러한 방식의 구현은 좋은 성능을 보여줍니다.

void insert(int key)
{
    insert_impl(key, 0, 1);
}

void insert_impl(int key, int cnt, int table)
{
    if (cnt >= size)
    {
        std::cout << key << " 삽입 시 순환 발생! 재해싱이 필요합니다!" << std::endl;
        return;
    }

    if (table == 1)
    {
        int hash = hash1(key);
        if (data1[hash] == -1)
        {
            std::cout << table << "번 테이블에 " << key << " 삽입" << std::endl;
            data1[hash] = key;
        }
        else
        {
            int old = data1[hash];
            data1[hash] = key;
            std::cout << table << "번 테이블에 " << key << " 삽입: 기존의 " << old << " 이동 -> ";
            insert_impl(old, cnt + 1, 2);
        }
    }
    else
    {
        int hash = hash2(key);
        if (data2[hash] == -1)
        {
            std::cout << table << "번 테이블에 " << key << " 삽입" << std::endl;
            data2[hash] = key;
        }
        else
        {
            int old = data2[hash];
            data2[hash] = key;
            std::cout << table << "번 테이블에 " << key << " 삽입: 기존의 " << old << " 이동 -> ";
            insert_impl(old, cnt + 1, 1);
        }
    }
}

실제 삽입 구현 함수는 세 개의 인자를 받습니다. key는 키를 의미하고, cnt는 재귀 호출 횟수이며, table은 키를 삽입할 테이블 번호입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.