Key-Value 구조의 자료구조입니다.📌 비교:
- 이진 탐색 트리(Binary Search Tree): O(log N)
- 해시 테이블(Hash Table): O(1) (단, 충돌이 적을 경우)
int key = userId % 1000; // 단순한 해시 함수 예시
hash(key) + 1 ➜ hash(key) + 2 ➜ ...
hash(key) + 1² ➜ hash(key) + 2² ➜ ...
std::map vs std::unordered_map (C++ STL 비교)| 항목 | std::map | std::unordered_map |
|---|---|---|
| 내부 구조 | Red-Black Tree | Hash Table |
| 시간 복잡도 | O(log N) | 평균 O(1), 최악 O(N) |
| 정렬 여부 | 자동 정렬됨 | 정렬되지 않음 |
| 메모리 사용 | 적음 | 비교적 많음 |
| C# Dictionary와 유사 | ❌ | ✅ |
💡 해시 기반의 구조는 속도는 빠르지만, 메모리 사용량이 증가하고 충돌 관리가 필요합니다.
void TestTable() {
struct User { int userId = 0; string username; };
vector<User> users(1000);
users[777] = {777, "Rookiss"};
cout << users[777].username << endl; // O(1)
}
✅ 빠르지만, ❌ 메모리 낭비 심함 (미사용 인덱스까지 확보)
void TestHash() {
struct User { int userId = 0; string username; };
vector<User> users(1000);
int userId = 123456789;
int key = userId % 1000;
users[key] = {userId, "Rookiss"};
User& user = users[key];
if (user.userId == userId)
cout << user.username << endl;
}
⚠️ 단점: 동일 key 충돌 시 데이터 덮어쓰기 발생
void TestHashTableChaining() {
struct User { int userId = 0; string username; };
vector<vector<User>> users(1000);
int userId = 123456789;
int key = userId % 1000;
users[key].push_back({userId, "Rookiss"});
users[789].push_back({789, "FakeID"}); // 충돌 예시
for (User& user : users[key])
if (user.userId == userId)
cout << user.username << endl;
}
✅ 체이닝 방식은 충돌에도 안전
❌ 단, 탐색시 최악의 경우 O(N)
입력: "qwer1234"
해시: "asdf123!@asdfasdf1234"