2016-12-11 4 views
0

해시 테이블에 대한 부하 요인에 대해 혼란스러워합니다.
로드 펙터를 계산하기 위해서는 엔트리 수를 우리가 가지고있는 슬롯 수로 나눌 필요가 있고 부하율이 0.75에 이르면 다시 해쉬해야한다는 것을 알고 있습니다.충돌이있는 해시 테이블의 부하 요인에 대해 혼동했습니다.

그래서이 해시 테이블의 "엔트리 수"는 얼마입니까? 이 키가 차지하는 총 키 수 또는 인덱스 수입니다.

총 키 수인 경우 다시 해싱하는 것이 무엇이겠습니까? 그것은 단지 공간과 시간을 낭비 할뿐입니다.
그리고 인덱스의 총 개수가 차지하는 경우 부하 계수는 2/5 = 0.4입니까? 대안 적으로, Set 요소의 수가 https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#entrySet--

이 일치하여 리턴 https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#size-- 또는 의해 반환 항목

enter image description here

+0

항목 수는 모든 키가 하나의 연관된 값을 가지며 항목이 키/값 쌍인 키의 수입니다 (예). 그러한 맵을 재 강조한 포인트는 정확하게 맵의 성능에 해를 끼치는 긴 링크리스트를 피하고 더 나은 방법으로 버킷 사이에 엔트리를 분배하는 것입니다. 이상적인 분포는 각 버킷에 0 또는 1 개의 항목 만있는 경우입니다. –

+0

그런 충돌이 일어 났을 때, rehashing은 도움이되지 않을 것입니다, 그렇죠? hashFunction 만 변경하면됩니까? – Nicky

+0

아니요 간단한 예를 들어 봅시다.지도에 3 개의 버킷이 있고 해시 코드의 간단한 모듈을 사용하여 버킷을 선택합니다.지도에 0, 3 및 6이 있다고 가정 해 봅시다. 0 % 3 == 0, 3 % 3 == 0 및 6 % 3 == 0이기 때문에 모두 버킷 0에 포함됩니다. 이제 다시 해시하고 대신 7 개의 버킷을 사용하십시오. 이제 0 % 7 == 0이므로 첫 번째 키는 버킷 0으로 이동합니다. 3 % 7 == 3이므로 버킷 3에서 끝납니다. 6 % 7 == 6이므로 키 6은 버킷 6으로 이동합니다 이제 키가 버킷 사이에 이상적으로 배포됩니다. –

답변

0

수가 맵 키 값의 매핑의 개수 지도가 무엇인지에 대한 직감, 키 - 값 쌍의 모음이므로 각 쌍은 하나의 항목입니다.

https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html의 항목 수는로드 인자 fac의 임의의 매개 변수와 용량 인 cap의 현재 버킷 수와 비교됩니다.

"부하율에 도달했을 때"라고 생각하지만 정확하지 않습니다. 부하율은 제작 후 변경되지 않습니다. 기본적으로 그것은 거의 모든 용도에 충분한 0.75입니다.

대신 threshold 제품 threshold = fac * cap;을 생각해보십시오. fac이 없기 때문에 cap이 변경되면 임계 값 만 변경됩니다.

항상 변경되는 내용은 현재지도에있는 항목 수인 nentries입니다.

(난 그냥이 답변을 단순화하기 위해 변수 이름을 만들고있어. 그들은 실제 자바 API 소스 코드와는 아무 상관이 없습니다.)

당신의 그림은 다섯 양동이, 그래서 threshold = (int)(0.75 * 5) 또는 3을 보여줍니다.

재실행 결정은 if (nentries >= threshold)입니다. 그림에 10 개의 항목이 있습니다. 예, 해당 맵에는 재진입이 필요합니다. 실제로는 구현에 따라 cap을 약 10 개 항목으로 증가 시켜서 세 번째 항목에 대해 재검토했을 것입니다. 여덟 번째 항목에서 용량은 20으로 증가하므로 열 개의 항목이 새 임계 값 threshold = 0.75 * 20 또는 16보다 작습니다.

+0

조금 혼란스러워! 다른 기사에 따르면로드 계수 = 항목 수/슬롯 수입니다. 그 특별한 예에서는 2 일 것입니다. – Nicky

관련 문제