[巴金督の実戦アルゴリズム]ハッシュ
情報の一部だけを覚えてマッチングします.
📍 鍵に対応する値を格納するデータ構造配列を使用すると、O(N)を使用して要素が検索され、ハッシュテーブルのすべての演算(挿入、Erase、Find、Update)はO(1) である.ハッシュ関数:任意の長さのデータを固定長のデータに対応する関数(一部の情報のみ表示!)
->配列として使用されるインデックス キーが等しい場合は が発生する.の衝突を阻止できない 衝突が発生した場合の回避案 がある.
接続リスト を使用実STLデータ構造使用Chaining は、良好なハッシュ関数 を定義する必要がある.
インデックスを基準として、要素がすでに含まれている場合は、隣に を挿入する.を削除するときは、スペース を避けるために、ゴミの値を対応するセルに入れます.
STL
キーに対応する値を検索
📍 鍵に対応する値を格納するデータ構造
->配列として使用されるインデックス
コンフリクト問題
1)衝突回避1-Chaining
2)衝突回避2-Open Addressing
STL
1) unordered_set
#include <unordered_set>
void unordered_set_example() {
unordered_set<int> s;
s.insert(-10);
s.insert(100);
s.insert(15);
s.insert(-10); // 중복 불가
cout << s.erase(100) << '\n'; // 1 반환
cout << s.erase(20) << '\n'; // 0 반환
if (s.find(15) != s.end()) // 반환값의 형태는 iterator
cout << "15 is in s\n";
else
cout << "15 is not in s\n";
cout << s.size() << '\n'; // 2 반환
cout << s.count(50) << '\n'; // unordered_set에서는 중복이 허용되지 않으므로 항상 1 또는 0 반환
for (auto e : s) // range-based loop
cout << e << ' ';
cout << '\n';
}
2) unordered_multiset
✔」繰り返し許可#include <unordered_set>
void unordered_multiset_example() {
unordered_multiset<int> ms;
ms.insert(-10);
ms.insert(100);
ms.insert(15);
ms.insert(-10); // 중복 허용
ms.insert(15);
cout << ms.erase(15) << '\n'; // 15가 모두 다 지워짐!
cout << ms.erase(ms.find(-10)) << '\n'; // 딱 한 개의 -10만 지워짐
if (ms.find(15) != ms.end()) // 반환값의 형태는 iterator
cout << "15 is in ms\n";
else
cout << "15 is not in ms\n";
cout << ms.size() << '\n';
for (auto e : ms) // range-based loop
cout << e << ' ';
cout << '\n';
}
3) unordered_map
STL
#include <unordered_set>
void unordered_set_example() {
unordered_set<int> s;
s.insert(-10);
s.insert(100);
s.insert(15);
s.insert(-10); // 중복 불가
cout << s.erase(100) << '\n'; // 1 반환
cout << s.erase(20) << '\n'; // 0 반환
if (s.find(15) != s.end()) // 반환값의 형태는 iterator
cout << "15 is in s\n";
else
cout << "15 is not in s\n";
cout << s.size() << '\n'; // 2 반환
cout << s.count(50) << '\n'; // unordered_set에서는 중복이 허용되지 않으므로 항상 1 또는 0 반환
for (auto e : s) // range-based loop
cout << e << ' ';
cout << '\n';
}
#include <unordered_set>
void unordered_multiset_example() {
unordered_multiset<int> ms;
ms.insert(-10);
ms.insert(100);
ms.insert(15);
ms.insert(-10); // 중복 허용
ms.insert(15);
cout << ms.erase(15) << '\n'; // 15가 모두 다 지워짐!
cout << ms.erase(ms.find(-10)) << '\n'; // 딱 한 개의 -10만 지워짐
if (ms.find(15) != ms.end()) // 반환값의 형태는 iterator
cout << "15 is in ms\n";
else
cout << "15 is not in ms\n";
cout << ms.size() << '\n';
for (auto e : ms) // range-based loop
cout << e << ' ';
cout << '\n';
}
#include <unordered_map>
void unordered_map_example() {
unordered_map<string, int> m;
m["hi"] = 123;
m["bkd"] = 1000;
m["gogo"] = 165;
cout << m.size() << '\n'; // 3 반환
m["hi"] = -7;
if (m.find("hi") != m.end())
cout << "hi in m\n";
else
cout << "hi is not in m\n";
m.erase("bkd"); // ("hi", 123), ("gogo", 165)
for (auto e : m)
cout << e.first << ' ' << e.second << '\n';
}
Reference
この問題について([巴金督の実戦アルゴリズム]ハッシュ), 我々は、より多くの情報をここで見つけました https://velog.io/@jieun_han/바킹독의-실전-알고리즘-해시テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol