C++0x는 boost
및 기타 여러 곳에서 사용할 수있는 unordered_set
을 도입하고 있습니다. 제가 이해한 바에 따르면 unordered_set
은 O(1)
조회 복잡도를 가진 해시 테이블입니다. 반면에 set
은 log (n)
조회 복잡성을 가진 트리 일뿐입니다. **도대체 왜 unordered_set
대신 set
을 사용하는 걸까요? 즉, set
이 더 이상 필요하냐고요?
비순서 세트에는 갚기 위해 몇 가지 그들의 평균 액세스 시간 O (1)
< > -;;!
해시 테이블보다 트리를 선호하는 경우.
예를 들어 해시 테이블은 최악의 경우 O(n)입니다. O(1)은 평균적인 경우입니다. 트리는 최악의 경우 O(log n)입니다.
세트:
입력: 1, 2, 5, 3, 8, 9
출력: 1, 2, 3, 5, 8, 9
Unordered_set:
입력: 1, 2, 5, 3, 8, 9
출력: 8 9 3 1 2 5 (아마 이 주문, 휘둘리는 해시 함수)
set<vector<int>> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
cout<<vec<<endl; // I have override << for vector
// 1 2
// 1 3
',', '의 핵심 가치로 int> vector< 이유가 될 수 있기 때문에' 벡터 '세트', 'operator< 오버라이드합니다'.
하지만, ',' unordered_set< 사용하는 경우, vector< int> >, 해시 함수를 만들어야 합니다. "에 대한 벡터 does& vector< int> 때문에, 't have a # 39, 그러니 정의하십시오 해시 함수를 다음과 같습니다.
struct VectorHash {
size_t operator()(const std::vector<int>& v) const {
std::hash<int> hasher;
size_t seed = 0;
for (int i : v) {
seed ^= hasher(i) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
return seed;
}
};
vector<vector<int>> two(){
//unordered_set<vector<int>> s; // error vector<int> doesn't have hash function
unordered_set<vector<int>, VectorHash> s;
s.insert({1, 2});
s.insert({1, 3});
s.insert({1, 2});
for(const auto& vec:s)
cout<<vec<<endl;
// 1 2
// 1 3
}
일부 경우 'unordered_set 있는 것을 볼 수 있습니다' 는 좀 더 복잡하다.
주로 에서 인용. https://www.geeksforgeeks.org/set-vs-unordered_set-c-stl/ https://stackoverflow.com/a/29855973/6329006
저 그라고예, 또 어떤 다른 사람이 이미 언급되지 않았다. 반면 걱정했던것 상각 충족되었으며 unordered_set O (1) 는 복잡한 요소를 삽입 후 O (n), 이따금 will 시행하십시오 해시 테이블 때문에 재구성할 필요가 있는 & # 39 (the number of 버킷 변화해야 한다.), 심지어 good& # 39;; 해시 함수. 마찬가지로 삽입 후 O (n) 는 모든 요소에 벡터입니다 때문에 이제 기본 어레이입니다 재할당해야.
O (log n) 는 집합 내의 최대 항상 삽입. 일부 프로그램에서는 이 더 적합할 수도 있다.
내가 이 지배적인 linix c++컴파일러는 벤치 마크 구축현 차이를 볼 수 있습니다.
전체 벤치마트 정보 및 분석 부여받은 http://support. # 51944661 쉐퍼드도 여기에 반복하십시오 https://stackoverflow.com/questions/2558153/what-is-the-underlying-data-structure-of-a-stl-set-in-c/51944661 않습니다.
" BST"; ',' 와 함께 테스트되었습니다 고말은 " 표준용량 설정되었습니다 " 해시보다 map"; 테스트를 통해 ',' 고말은 " std::unordered_set. " Heap"; 내가 있는 것 '' std::priority_queue 캐비닛용입니다 http://support. # 29548834 https://stackoverflow.com/questions/6147242/heap-vs-binary-search-tree-bst/29548834
이에 따라 요약:
이 비용을 속도 향상을 위해 효율적을 트래버스합니다 에로남이네 수 없습니다.
이와 같은 질문을 'vs' 대한 '매핑해야 unordered_map': https://stackoverflow.com/questions/2196995/is-there-any-advantage-of-using-map-over-unordered-map-in-case-of-trivial-keys