일지
알고리즘...95
niamdank
2021. 12. 29. 17:35
해시 테이블, 체이닝 처리 구현
HashTable_Chaining.h
#pragma once
#include "../Common.h"
#include "HashTable.h"
#include <vector>
#include <list>
using std::vector;
using std::list;
/// <summary>
/// 충돌 해결 방법 중 체이닝을 구현한 해시 테이블
/// </summary>
class HashTable_Chaining : public HashTable
{
public:
HashTable_Chaining(HashFunction hashFunction = HashFunction::Division);
virtual void Add(int data) override;
virtual void Remove(int data) override;
virtual bool Contains(int data) override;
virtual void Clear() override;
virtual void PrintHashTable() override;
private:
vector<list<int>> m_table;
};
HashTable_Chaining.cpp
#include "HashTable_Chaining.h"
#pragma region Public Functions
/// <summary>
/// 해시 함수를 결정하고 해시 테이블을 초기화한다.
/// </summary>
/// <param name="hashFunction">사용할 해시 함수</param>
HashTable_Chaining::HashTable_Chaining(HashFunction hashFunction)
: HashTable(hashFunction)
{
for (int i = 0, total = Size(); i < total; i++)
{
m_table.push_back(list<int>());
}
}
/// <summary>
/// 데이터를 해시 테이블에 추가한다.
/// </summary>
/// <param name="data">추가할 데이터</param>
void HashTable_Chaining::Add(int data)
{
if (Contains(data))
{
return;
}
int idx{ GetHashIndex(data) };
m_table[idx].push_back(data);
}
/// <summary>
/// 데이터를 해시 테이블에서 제거한다.
/// </summary>
/// <param name="data">제거할 데이터</param>
void HashTable_Chaining::Remove(int data)
{
if (!Contains(data))
{
return;
}
int idx{ GetHashIndex(data) };
m_table[idx].remove(data);
}
/// <summary>
/// 주어진 값이 해시 테이블에 존재하는지 여부를 반환한다.
/// </summary>
/// <param name="data">찾을 데이터</param>
/// <returns>존재 여부</returns>
bool HashTable_Chaining::Contains(int data)
{
int idx{ GetHashIndex(data) };
for (auto d = m_table[idx].cbegin(); d != m_table[idx].cend(); d++)
{
if (*d == data)
{
return true;
}
}
return false;
}
/// <summary>
/// 해시 테이블의 모든 데이터를 지운다.
/// </summary>
void HashTable_Chaining::Clear()
{
for (int i = 0, total = Size(); i < total; i++)
{
m_table[i].clear();
}
}
/// <summary>
/// 해시 테이블의 현 상태를 출력한다.
/// </summary>
void HashTable_Chaining::PrintHashTable()
{
HashTable::PrintHashTable();
for (int i = 0, total = Size(); i < total; i++)
{
std::cout << " Index " << i << " : ";
if (m_table[i].size() > 0)
{
auto d = m_table[i].cbegin();
while (true)
{
std::cout << *d;
d++;
if (d == m_table[i].cend())
{
break;
}
std::cout << " - ";
}
}
else
{
std::cout << "EMPTY";
}
std::cout << '\n';
}
std::cout << '\n';
}
#pragma endregion
main.cpp
#include "Common.h"
#include "해시테이블/HashTable_Chaining.h"
int main()
{
HashTable_Chaining hashTable;
int arr[] = { 1, 3, 5, 7, 9,
12, 14, 16, 18, 20,
23, 25, 27, 29,
32, 34, 36, 38,
40, 43, 45, 47, 49 };
for (int i = 0; i < 23; i++)
{
hashTable.Add(arr[i]);
}
hashTable.PrintHashTable();
hashTable.Remove(16);
hashTable.Remove(27);
hashTable.Remove(47);
hashTable.PrintHashTable();
}
실행결과
------------------------------------------
- Class Name : class HashTable * __ptr64
- HashFuncion : Division
------------------------------------------
Index 0 : 34
Index 1 : 1 - 18
Index 2 : 36
Index 3 : 3 - 20
Index 4 : 38
Index 5 : 5
Index 6 : 23 - 40
Index 7 : 7
Index 8 : 25
Index 9 : 9 - 43
Index 10 : 27
Index 11 : 45
Index 12 : 12 - 29
Index 13 : 47
Index 14 : 14
Index 15 : 32 - 49
Index 16 : 16
------------------------------------------
- Class Name : class HashTable * __ptr64
- HashFuncion : Division
------------------------------------------
Index 0 : 34
Index 1 : 1 - 18
Index 2 : 36
Index 3 : 3 - 20
Index 4 : 38
Index 5 : 5
Index 6 : 23 - 40
Index 7 : 7
Index 8 : 25
Index 9 : 9 - 43
Index 10 : EMPTY
Index 11 : 45
Index 12 : 12 - 29
Index 13 : EMPTY
Index 14 : 14
Index 15 : 32 - 49
Index 16 : EMPTY
NadanKim/Algorithm: 알고리즘 학습 및 예제 코드 작성을 위한 저장소 (github.com)
GitHub - NadanKim/Algorithm: 알고리즘 학습 및 예제 코드 작성을 위한 저장소
알고리즘 학습 및 예제 코드 작성을 위한 저장소. Contribute to NadanKim/Algorithm development by creating an account on GitHub.
github.com