C++에서 hash_map
및 map
이라는 질문이 있습니다. map
은 STL이지만, hash_map
은 표준이 아닙니다. 둘의 차이점은 무엇입니까?지도 대 C++의 hash_map
답변
매우 다른 방식으로 구현됩니다.
hash_map
(TR1 및 부스트에서는 unordered_map
) 대신 해시 테이블을 사용하면 키가 테이블의 슬롯에 해시되고 해당 값이 해당 키와 연결된 목록에 저장됩니다.
map
은 균형 이진 검색 트리 (보통 빨간색/검은 색 트리)로 구현됩니다.
unordered_map
은 컬렉션의 알려진 요소에 액세스 할 때 약간 더 나은 성능을 제공해야하지만 map
은 추가적인 유용한 특성 (예 : 정렬 된 순서로 저장되어 시작부터 끝까지 허용)을 갖습니다. unordered_map
은 삽입 및 삭제가 map
보다 빠릅니다.
C++ 사양은 STL 컨테이너에 사용해야하는 알고리즘을 정확히 말하지 않습니다. 그러나 map
및 기타 연관 컨테이너의 해시 테이블 사용을 배제하는 성능에 특정 제약 조건을 적용합니다. (가장 일반적으로 빨강/검정 나무로 구현됩니다.) 이러한 제약 조건은 해시 테이블이 제공 할 수있는 것보다 더 나은 최악의 경우 성능을 요구합니다.
많은 사람들이 실제로 해시 테이블을 원하지만 해시 기반 STL 연관 컨테이너는 수년간 공통된 확장 프로그램이었습니다. 결과적으로 그들은 더 많은 버전의 C++ 표준에 unordered_map
등을 추가했습니다.
TR1 (std :: tr1 :: unordered_map)에 실제로 추가되었으며 C++ 0x –
이 수정되었습니다. –
'map '이 일반적으로 균형 잡힌 btree 인 이유는 위치를 결정하는 수단으로'operator <()'를 사용했기 때문이라고 생각했습니다. – KitsuneYMG
hash_map
은 많은 라이브러리 구현에서 제공되는 공통 확장입니다. 이것이 바로 TR1의 일부로 C++ 표준에 추가되었을 때 unordered_map
으로 이름이 변경된 이유입니다. 지도는 일반적으로 빨강 - 검정 나무와 같은 균형 잡힌 이진 트리로 구현됩니다 (구현은 물론 다릅니다). hash_map
및 unordered_map
은 일반적으로 해시 테이블로 구현됩니다. 따라서 주문은 유지되지 않습니다. unordered_map
삽입/삭제/질의는 O (1) (상수 시간)가 될 것이며, 여기서 map은 O (log n)가 될 것이다. 여기서 n은 데이터 구조에있는 항목의 수이다. 따라서 unordered_map
은 빠르며, 항목의 순서가 마음에 들지 않으면 map
이상을 선호해야합니다. 때로는 주문을 키순으로 유지하기를 원하며 그 경우 map
이 선택 될 수 있습니다.
충돌이 발생할 가능성이있는 경우 해시 맵에 O (N)의 최악의 액세스가 있다고 지적합니다. – KitsuneYMG
좋은 해시 맵의 예상 비용은 O (1)이며, 그렇지 않습니다. 보장 될 것입니다. 잘못된 해시 맵의 예상 비용은 O (1)이 아닐 수 있습니다. – Clearer
몇 가지 중요한 차이점은 복잡성 요구 사항에 있습니다.
지도에는 삽입 및 찾기에 O (log (N)) 시간이 필요합니다.
unordered_map은 삽입과 발견에 대해 O (1)의 평균 시간이 필요하지만 최악의 경우 O (N) 시간이 허용됩니다.
일반적으로 unordered_map은 더 빠르지 만 저장하는 키와 해시 함수에 따라 훨씬 더 심각해질 수 있습니다.
무엇을 제공하는지 모르지만 hash_map은 부호없는 정수 키와 부동 소수점 값을 지우는 데 20 초 이상 소요됩니다. 나는 지금 막 달리고 다른 사람의 부호를 읽고있다.
hash_map을 포함하는 방법입니다.
#include "StdAfx.h"
#include <hash_map>
나는 그() O (N)의 순서 분명하다 말을 여기
https://bytes.com/topic/c/answers/570079-perfomance-clear-vs-swap
이를 참조하십시오. 그것은 저에게는 매우 이상합니다. 그러나 그것이 그 방법입니다.
- 1. C# Hashtable 대 C++ hash_map
- 2. hash_map 및 stdext :: hash_map?
- 3. 지도 대 mapM 동작
- 4. PHP의 feof 동작 대 C의
- 5. hash_map questions/tutorial
- 6. C의 사전 /지도/키 - 값 쌍 데이터 구조
- 7. 원시 데이터 형식 대 Objective C의 개체
- 8. 오류 처리 대 대상 c의 예외 처리
- 9. hash_map C++ stl에서 충돌 발생
- 10. C++에서 hash_map 예제를보고 싶습니다.
- 11. 지도?
- 12. 지도,
- 13. 지도
- 14. 표준 : :지도 디자인 :지도 STL에서
- 15. 맥 OSX에서 헤더를 hash_map 찾을 수 없습니다
- 16. stl hash_map 단순 해시 함수보다 느림?
- 17. g ++ hash_map deprecation 경고를 제거하는 방법은 무엇입니까?
- 18. 지도 값
- 19. 지도 (/ @) 동작
- 20. 스칼라 :지도
- 21. 지도 - 값
- 22. 표준 : :지도 : : (
- 23. 지도 상속
- 24. 지도 다루기
- 25. 지도 C++
- 26. 지도 STL
- 27. 지도 조작
- 28. 는 []지도
- 29. 지도 소멸자 오류
- 30. 대칭 -c의 동일한 위치에서 파일 이름 대/소문자를 바꾸는 방법
성능과 관련하여 귀하의 의견에 완전히 동의하지 않습니다. 성능은 여러 매개 변수의 영향을받으며 "빠른 것"이기 때문에 unordered_map을 사용하는 모든 프로그래머에게 단 10 개의 항목 만 표시합니다. 나중에 인터페이스/기능에 대해 걱정할 필요가 있습니다. –
글쎄, 네가 문제를 이해한다면 도움이된다. 특정 크기의 주문까지는 성능면에서는 워시가 될 수 있지만, 데이터 볼륨이 커짐에 따라 두 가지 컨테이너가 서로 다른 방식으로 벗어날 때 컨테이너의 성능 특성을 이해하는 것이 중요합니다. – Joe
흥미롭게도, 나는 std :: map을 boost :: unordered_map으로 바꿨다. 많은 무작위 찾아보기를 수행하는 응용 프로그램에서뿐만 아니라지도의 모든 키를 반복한다. 조회에 많은 시간을 절약했지만 반복을 통해 다시 얻었으므로지도로 전환했으며 응용 프로그램 성능을 향상시키는 다른 방법을 찾고 있습니다. –