답변
사전은 해시 코드를 사용하여 항목이 저장된 버킷 번호를 계산합니다. 버킷 수는 소수가되도록 선택되고 특정 키의 버킷 수는 버킷 수를 모듈로 나타내는 키의 해시 코드로 계산됩니다. 여러 객체가 동일한 해시 코드를 가질 수 있고 여러 해시 코드가 동일한 버킷에있을 수 있으므로 버킷에서 키가 발견되면 키가 올바른지 비교하기 위해 동등성을 비교해야합니다. 버킷에 잘못된 키가 있으면 잘못된 항목의 구성원 인 next
을 사용하여 원하는 키를 검색 할 다음 장소를 찾습니다.
충돌이없는 경우 올바른 버킷은 매우 빠르게 찾을 수 있지만 최악의 경우에는 사전에 저장된 항목 수에 선형 시간이 걸릴 수 있습니다. 여기서는 객체의 해시 코드를 일정 시간 내에 계산할 수 있다고 가정합니다.
닷넷 구현 실제 코드, 또는 .NET 반사경을 이용하여, 기준 구현 소스를 다운로드함으로써 알 수있다 :
private int FindEntry(TKey key)
{
if (key == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
}
if (this.buckets != null)
{
int num = this.comparer.GetHashCode(key) & 0x7fffffff;
for (int i = this.buckets[num % this.buckets.Length]; i >= 0; i = this.entries[i].next)
{
if ((this.entries[i].hashCode == num) && this.comparer.Equals(this.entries[i].key, key))
{
return i;
}
}
}
return -1;
}
그런 다음 연결된 목록이 검색됩니다. 해시 코드는 버킷 수를 기반으로하므로 충돌 수가 많으면 버킷의 크기가 조정되고 해시가 다시 계산됩니다. (맞습니까?) –
빈 검색입니까? – Blankman
@ 존 - 나는 '충돌이 높고 양동이의 크기를 조정해야하며 해시를 다시 계산해야합니다'라고 다시 작성합니다. – KevinDTimm
해시 희망 생성 키에 대하여 단지 알고리즘을 실행 (인) 항목을 저장할 버킷을 가리키는 고유 한 값입니다. 따라서 값을 계산하여 해당 항목을 검색 할 때 해시가 이전에 저장 한 개체를 가리 키기를 바랍니다. 그렇지 않은 경우이 해시 값을 공유하는 다음 개체를 찾을 위치에 대한 포인터가 있어야합니다. 당신이 당신의 품목을 발견 할 때, 그것은 돌려 보낼 것이다. 체인의 끝에 도달하면 항목을 찾을 수 없습니다.
해싱에 대한 자세한 정의는 Hash Tables 및 Hash Function을 참조하십시오.
- 1. Solr의 MoreLikeThis 구성 요소는 어떻게 결과를 얻기 위해 내부적으로 작동합니까?
- 2. 배열에서 값을 얻기 위해 오른쪽 키를 가리키는 방법은 무엇입니까?
- 3. 프로그래밍에서 해시가 어떻게 작동합니까?
- 4. RegExpr을 얻기 위해 값을 얻으려면
- 5. 데이터베이스가 내부적으로 어떻게 작동합니까?
- 6. Viewstate는 내부적으로 어떻게 작동합니까?
- 7. 근검은 어떻게 내부적으로 작동합니까?
- 8. 메모리를 얻기 위해 어떻게 기능
- 9. Facebook 페이지에서 공유하는 링크를 어떻게 조회합니까?
- 10. L1 및 L2 캐시를 어떻게 조회합니까?
- 11. XML 속성 값을 얻기 위해 구문 분석
- 12. 값을 얻기 위해 프로그래밍 방식으로 스타일에 액세스하기
- 13. 값을 얻기 위해 속성을 전달하는 것 (표현식처럼)
- 14. dijit.Dialog의 값을 얻기 위해 dojo.query를 얻는 방법
- 15. onListItemClick, 값을 얻기 위해 필요한 성명은 무엇입니까?
- 16. LINQ는 내부적으로 어떻게 작동합니까?
- 17. stringstream은 어떻게 내부적으로 작동합니까?
- 18. Firebug는 내부적으로 어떻게 작동합니까?
- 19. "is"연산자는 내부적으로 어떻게 작동합니까?
- 20. 어떻게 파일의 크기를 얻기 위해 노력하고
- 21. 어떻게 버튼 POST 데이터를 제출 얻기 위해()
- 22. 재스퍼를 얻기 위해 jrxml을 어떻게 컴파일합니까?
- 23. CreateMutex()는 내부적으로 어떻게 작동합니까?
- 24. ASP.NET 라우팅은 어떻게 내부적으로 작동합니까?
- 25. 람다 식은 어떻게 내부적으로 작동합니까?
- 26. joomla breadcrumbs는 어떻게 내부적으로 작동합니까?
- 27. 파이썬은 어떻게 목록을 내부적으로 저장합니까?
- 28. QProcess는 내부적으로 리눅스에서 어떻게 작동합니까?
- 29. BULK INSERT는 어떻게 내부적으로 작동합니까?
- 30. 키워드를 사용하여 값을 얻기 위해 문자열을 HTML로 구문 분석합니다.
"빈 분류"란 무엇입니까? – Gabe
@ 게이브 : 그가 의미하는 바는 다음과 같습니다. "바이너리 정렬" – digEmAll
사전에 대해 묻는다면 2 진 검색 *이 적합 할 것이라고 생각합니다. – Gabe