언제 다른 하나를 선택해야합니까? 올바른 STL 컨테이너를 사용하기 위해 권장할만한 포인터가 있습니까?C++ STL의 집합과 해시 집합의 차이점은 무엇입니까?
답변
hash_set
은 C++ 표준의 일부가 아닌 확장입니다. 조회는 set
에 대한 O (log n)보다는 O (1)이어야하므로 대부분의 경우 더 빠릅니다.
컨테이너를 반복 할 때 또 다른 차이점이 나타납니다. set
은 내용을 정렬 된 순서로 전달하며, hash_set
은 기본적으로 무작위입니다 (Lou Franco에게 감사드립니다).
편집 : C++ 표준 업데이트는 hash_set
대신에 unordered_set
을 사용해야합니다. 성능은 유사하며 표준에 의해 보장됩니다. 이름에서 "정렬되지 않음"은 특정 순서없이 결과를 생성한다는 점을 강조합니다.
또한 세트가 주문됩니다. –
hash_set은 대부분 O (1) 연산을 사용하는 해시 테이블로 구현되지만 집합은 O (log n)을 갖는 일종의 트리 (AVL, 빨강 검정 등) 작업을 수행하지만 정렬 된 순서로 수행됩니다.
편집 : 나는 그 나무가 O (n)라고 썼다. 그건 완전히 잘못되었습니다.
나무에 대한 O (로그 n) – Andrey
붉은 검정 나무는 O (n)입니까? –
오, 오, 나는 O (n)을 썼다는 것을 믿을 수 없다. 아마 하루 종일 멍청한 짓이야. –
stl::set
은 2 진 검색 트리로 구현됩니다. hashset
은 해시 테이블로 구현됩니다.
여기서 중요한 문제는 stl::set
이 O (1)의 조회가있는 해시 테이블이라고 생각한다는 것입니다. O (1)은 아니며 갖고 있지도 않습니다. 룩업을위한 O (log (n))를 가지고 있습니다. 그 다음에는 이진 트리와 해시 테이블에 대해 읽은 다음 데이터 구조를 더 잘 이해할 수 있습니다.
왜 이것은 다운 그레이드 되었습니까? 레드 - 블랙 트리는 일종의 바이너리 검색 트리이며, 스펙은 레드 블랙이어야한다고 말하지는 않습니다 - 작업을위한 big-O 매개 변수를 설정했습니다. –
'stl :: set'이란 무엇입니까? –
@ LouFranco : 아마도 표준 위임 된 동작/의미보다는 가능한 (가능성이있는) 구현에 대해 논의했기 때문일 것입니다. –
hash_set을 사용하면 hash_set을 사용하여 해시 함수를 제공해야하지만 집합에는 정의하기 쉽고 네이티브 형식에 대해 미리 정의 된 비교 함수 ('<') 만 필요합니다.
네이티브 형식에 대한 해시 함수도 있습니다. –
아무도 아직 질문의 다른 부분에 답변을했다고 생각하지 않습니다.
hash_set 또는 unordered_set을 사용하는 이유는 일반적으로 O (1) 조회 시간입니다. 일반적으로 구현에 따라 해시를 더 큰 해시 배열에 복사해야하거나 해시 버킷에 수천 개의 항목이 포함될 수 있기 때문에 일반적으로 말합니다.
집합을 사용하는 이유는 집합의 가장 큰 또는 가장 작은 구성원이 필요한 경우가 많기 때문입니다. 해시에는 순서가 없으므로 가장 작은 항목을 빨리 찾을 방법이 없습니다. 나무는 순서가 있으므로 가장 크거나 작은 나무는 매우 빠릅니다. O (log n), 끝점에 대한 포인터를 보유하고 있다면 O (1).
- 1. 변경 집합과 패치의 차이점은 무엇입니까?
- 2. 주어진 집합의 하위 집합과 일치하는 정규식?
- 3. 정렬되지 않은 집합의 해시?
- 4. 해시지도, 해시 집합, 해시 사전의 차이점은 무엇입니까?
- 5. 사전과 해시 테이블의 실제 차이점은 무엇입니까?
- 6. STL의 BST 구현
- 7. stl C++ : 집합의 클래스
- 8. 집합의 집합의 열거
- 9. C++ STL의 문자열 이진 데이터에 대한 eqivalent
- 10. VS2010 SP1의 C++ 및 STL의 새로운 기능은 무엇입니까?
- 11. std :: string은 STL의 일부입니까?
- 12. C# 데이터 집합의 테이블 재정렬
- 13. STL의 const_iterator에서 데이터를 가져 오는 방법은 무엇입니까?
- 14. 연산자 오버로드 STL의 성능 저하는 무엇입니까
- 15. 제한 stl의 벡터 max_size
- 16. hash_map은 STL의 일부입니까?
- 17. hash_map과 unordered_map의 차이점은 무엇입니까?
- 18. 캐스팅과 C#의 차이점은 무엇입니까?
- 19. C#, System.Window.Controls와 System.Windows.Forms의 차이점은 무엇입니까?
- 20. C++ STL의`transform`과 같은 Objective-C 알고리즘이 있습니까?
- 21. Managed C++와 C++/CLI의 차이점은 무엇입니까?
- 22. 관리되는 C++과 C#의 차이점은 무엇입니까?
- 23. 결과 집합과 문을 닫음
- 24. API C++/STL의 KMP 또는 Boyer-Moore 문자열 패턴 일치?
- 25. C++에서 해시 항목을 보는 방법은 무엇입니까?
- 26. C++에서 해시 테이블을 만드는 방법은 무엇입니까?
- 27. 해시 테이블의 용도는 무엇입니까? asp.net C#
- 28. PHP에서 Array와 Hash의 차이점은 무엇입니까?
- 29. 해시 함수 란 무엇입니까?
- 30. C# 임의의 Md5 해시 생성
STL에는'hashset '이 없습니다. 내년에 C++ (잘하면)에'unordered_set'이있을 것입니다. – avakar
이것에 대해 이야기하기 http://www.sgi.com/tech/stl/hash_set.html – kal
@mkal : 그건 표준 STL의 일부가 아닙니다. hash_set은 확장이다. – kennytm