3
A
回答
6
字典使用哈希碼來計算存儲條目的存儲區的數量。桶的數量被選爲質數,並且特定鍵的桶編號被計算爲密鑰的哈希碼以桶數爲模。由於多個對象可以具有相同的哈希代碼,並且多個哈希代碼可以位於同一個存儲桶中,因此當在存儲桶中找到密鑰時,還必須對它們進行比較以確保它是正確的密鑰。如果在存儲桶中找到了錯誤的密鑰,則會使用錯誤條目的next
成員查找下一個位置以搜索所需的密鑰。
該算法的結果是,當沒有衝突時,可以非常快速地找到正確的桶 - O(1),但在最糟糕的情況下,它可能需要線性時間存儲在詞典中的條目數。我在這裏假設一個對象的哈希碼可以在不變的時間內計算出來。
在.NET執行的實際代碼可以通過下載參考實現源可以看出,或通過使用.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;
}
0
散列僅僅是一個針對該創建密鑰算法運行(希望)一個指向哪個桶來存儲項目的唯一值。因此,當您計算值以嘗試檢索該項目時,您的希望是該哈希將指向您先前保存的對象。如果不是,則應該有一個指向哪裏尋找共享此散列值的下一個對象。當你找到你的物品時,它會返回。如果到達鏈條的末端,則無法找到您的物品。
請參閱Hash Tables和Hash Function以更全面地定義哈希。
相關問題
- 1. 如何獲取散列內的鍵/值對的位置?
- 2. 如何從嵌套散列獲取鍵值或鍵值的值?
- 3. 如何在散列中查找值?
- 4. 提取關鍵值對從散列
- 5. 如何根據散列中的鍵/值在Redis中查找並添加鍵/值數據到散列?
- 6. 散列的perl散列 - 對於eacy鍵組的內部鍵和相應的值
- 7. 在散列表中,如何通過鍵獲取對象值?
- 8. 如何獲取perl中嵌套散列內部散列的大小?
- 9. 獲取散列值
- 10. 如何從數組中的嵌套散列獲取鍵值?
- 11. 如何使用嵌套散列獲取多個散列鍵?
- 12. 如何從值散列獲得頂部鍵
- 13. 如何在帶下劃線的散列中找到最小值的關鍵字
- 14. 按值查找列表的關鍵字
- 15. 如何從散列引用獲取鍵和值?
- 16. 如何從JSON散列獲取值
- 17. 如何獲取散列值,C++ hash_map
- 18. 如何從URL中獲取散列值
- 19. 獲取內部陣列排列鍵的值
- 20. 如何在數組散列的Perl散列中查找最小值?
- 21. 關鍵字是正則表達式的散列查找
- 22. 如何獲取Android中的通訊錄API「查找關鍵字」?
- 23. 在散列數組中獲取鍵的值
- 24. 如何通過散列的Perl散列中的值訪問鍵?
- 25. 如何獲取(string,list)的keyvaluepair列表的內部列表值?
- 26. 如何獲取進程中關鍵部分的列表
- 27. 在散列中查找最低值
- 28. 在嵌套散列中查找值
- 29. 如何使用foreach獲取關鍵值?
- 30. 從URL獲取關鍵值(內部視圖)
什麼是「bin排序」? – Gabe 2010-12-06 21:02:26
@Gabe:我想他的意思是:「二進制排序」 – digEmAll 2010-12-06 21:03:46