std hash 예제

Off
Non classé

C++ STL에는 라이브러리 하나의 해시 함수가 있습니다. 이 데이터 형식에 사용할 수 있습니다: 해시 테이블에 `N` 버킷 수가 되도록 해시 함수를 만들어 보겠습니다. 해시 테이블에 노드를 삽입하려면 지정된 키에 대한 해시 인덱스를 찾아야 합니다. 그리고 해시 함수를 사용하여 계산할 수 있습니다. 예 : 해시 인덱스 = 키 % noOfBuckets 정렬되지 않은 연관 컨테이너의 키로 사용하려는 내 자신의 데이터 형식에 이론을 적용하여 데이터 형식은 해시 함수와 같음 함수가 필요합니다. 예. std::hash 정확한 계산에만 유용합니다. 구조체에 대해 해시 함수를 만드는 방법에는 여러 가지가 있습니다. 예를 들어 MyAbsMap은 다른 전략을 따릅니다. 이름에 따라 MyAbsMap은 정수의 절대 값(줄 25)을 기준으로 해시 값을 만듭니다. 오버로드 된 호출 연산자가있는 클래스 MyEq를 같음 함수로 사용합니다.

MyEq는 정수의 절대 값에만 관심이 있습니다. 출력은 MyAbsMap의 해시 함수가 다른 키에 대해 동일한 해시 값을 반환한다는 것을 보여 준다. 그 결과 MyInt(-2)(줄 70)의 해시 값이 MyInt(2)의 해시 값과 동일합니다. MyAbsMap을 쌍으로 초기화하지는 않았지만 (MyInt (2,2). 이 템플릿의 모든 표준 라이브러리 특수화의 모든 멤버 함수는 std::hash, std::hash, 및 std::hash 내 이전 게시물 이후 unordered_map에 대한 해시 함수를 설명하고 싶습니다. 간단한 예제 :(주의하십시오;그것은 단지 샘플이며 물론 좋은 해시 기능이 아닙니다) 이제 더 흥미로워집니다. 기본적으로 해시 함수 std:::hash 및 같음 함수 std::equal_to 사용 됩니다. 따라서 특수 해시 또는 같음 함수가 있는 std::unordered_map을 인스턴스화할 수 있습니다. 하지만 그만. 왜 우리는 평등 함수가 필요합니까? 해시 함수는 키를 해시 값에 매핑합니다.

해시 값은 버킷을 결정합니다. 이 매핑은 충돌을 일으킬 수 있습니다. 즉, 다른 키가 동일한 버킷으로 이동합니다. std::unorderd_map은 이러한 충돌을 처리해야 합니다. 이렇게 하려면 같음 함수를 사용합니다. 완전성 상의 이유만. Allocator를 사용하면 컨테이너의 할당 전략을 조정할 수 있습니다. 정렬되지 않은 연관 컨테이너 std::unordered_set, std:unordered_multiset, std::unordered_map, std:unordered_multimap 기본 해시 함수로 템플릿 std::hash의 전문화 를 사용합니다. 해시 테이블을 더 잘 이해하기 위해 퍼즐의 한 조각이 여전히 누락되었습니다.

해시 함수는 키를 값에 매핑합니다. 따라서 해시 함수는 int 또는 std::string의 키를 버킷에 매핑합니다. 어떻게 그게 가능해요? 한편으로는 거의 무한한 수의 키가 있지만 버킷수는 한정되어 있습니다. 그러나 그것이 내가 가진 유일한 질문이 아닙니다. 하나의 버킷에 얼마나 많은 요소가 전달되지는? 또는 다르게 말합니다. 충돌이 얼마나 자주 발생합니까? 다음 게시물이 답변을 줄 질문입니다. 주2: 두 개의 해시를 조합하는 것에 주의하십시오. 두 가지 좋은 방법이 있습니다: 해시 템플릿은 CopyConstructible 및 소멸 모두입니다. 4. 동일한 두 매개 변수 k1 및 k2의 경우 std::hash()(k1) == std::hash()(k2). 정렬되지 않은_map의 메서드 정렬되지 않은_map에서 작동하는 많은 기능을 사용할 수 있습니다.

그 중 가장 유용한 것은 연산자 =, 연산자 [], 용량에 대한 빈 및 크기, 시작 및 끝, 검색 및 조회에 대한 계산, 삽입 및 수정을 위해 삭제합니다. C++11 라이브러리는 내부적으로 사용되는 버킷 수, 버킷 크기 및 사용된 해시 함수 및 다양한 해시 정책을 볼 수 있는 기능을 제공하지만 실제 응용 프로그램에서는 유용하지 않습니다.

Comments are closed.