해시란 데이터를 다루는 기법 중에 하나로 검색과 저장이 아주 빠르게 진행된다. 데이터를 검색할 때 사용할 Key와 실제 데이터의 값(Value)이 한 쌍으로 존재하고, Key값이 배열의 인덱스로 변환되기 때문에 검색과 저장의 평균적인 시간 복잡도가 O(1)에 수렴하게 된다.
즉 데이터를 효율적으로 관리하기 위해, 임의의 길이 데이터를 고정된 길이의 데이터로 매핑하는 것
해시 함수(키값을 인덱스로 보낸다)를 구현하여 데이터 값을 해시 값으로 매핑한다.
즉, 해시 = 키에 대응되는 값을 저장하는 자료구조
(출처 : https://twinparadox.tistory.com/518)
< Linear Probing >
< Quadratic Probing >
< Double Hashing >
#include <string>
#include <vector>
#include <unordered_set>
#include <iostream>
using namespace std;
int main() {
unordered_set<int> us;
us.insert(1); // 삽입
us.insert(2);
us.insert(3);
us.insert(4);
us.insert(5);
us.insert(6);
// 순회1
unordered_set<int>::iterator iter;
for(iter = us.begin(); iter != us.end(); iter++) {
cout << *iter << "\n";
}
cout << "/////\n";
cout << us.size() << "\n"; // 6 출력
us.insert(1);
cout << us.size() << "\n"; // 6 출력
cout << us.erase(2) << "\n"; // 1 출력, 2는 set에 들어있었으므로 지운 후 1 출력
cout << us.erase(7) << "\n"; // 0 출력, 7는 set에 들어있지 않았으므로 0 출력
// find : 값을 찾고 iterator 반환, 값이 없다면 end() 반환
if(us.find(3) != us.end()) {
cout << "find 3\n";
}
if(us.find(2) == us.end()) {
cout << "2 already erased\n";
}
cout << us.count(1) << "\n";
// count : 해당 원소 몇개인지 -> 중복허용 없으므로 사실상 0 아니면 1
// 순회2
cout << "/////\n";
for(auto it : us) { // range-based for loop
cout << it << "\n";
}
return 0;
}
#include <string>
#include <vector>
#include <unordered_set>
#include <iostream>
using namespace std;
int main() {
unordered_multiset<int> ms;
ms.insert(-10);
ms.insert(100);
ms.insert(15); // {-10, 100, 15}
ms.insert(-10);
ms.insert(15); // {-10, -10, 100, 15, 15}
cout << ms.size() << '\n'; // 5
for (auto e : ms)
cout << e << ' ';
cout << '\n';
cout << ms.erase(15) << '\n'; // {-10, -10, 100}, 2 / 15가 여러 개 존재하면 모두 지워진다
ms.erase(ms.find(-10)); // {-10, 100} // 하나만 지우고 싶은 경우 iterator 전달
ms.insert(100); // {-10, 100, 100}
cout << ms.count(100) << '\n'; // 2
return 0;
}
< 참고링크 >
https://yang-droid.tistory.com/45