我沒有考慮使用「MOD PRIME」類型的哈希函數,並且對於如何使用返回的哈希值將值存儲在HashMap中。哈希表 - 將哈希值映射到索引
我想實現一個HashMap,其中的鍵是一個64位int(long long int)。我有一個散列函數,返回一個long int。問題是,使用這個返回的散列值來確定表索引的最好方法是什麼?因爲我的表顯然會小於散列值的範圍。
是否有任何指導方針來選擇最佳桌子尺寸?或者將散列值映射到表的大小的最佳方法?
謝謝。
我沒有考慮使用「MOD PRIME」類型的哈希函數,並且對於如何使用返回的哈希值將值存儲在HashMap中。哈希表 - 將哈希值映射到索引
我想實現一個HashMap,其中的鍵是一個64位int(long long int)。我有一個散列函數,返回一個long int。問題是,使用這個返回的散列值來確定表索引的最好方法是什麼?因爲我的表顯然會小於散列值的範圍。
是否有任何指導方針來選擇最佳桌子尺寸?或者將散列值映射到表的大小的最佳方法?
謝謝。
您需要調整表格的大小。根據您使用的方法,您需要在調整大小和複製操作期間重新掃描所有密鑰,或使用某種形式的dynamic hashing,例如extendible hashing或linear hashing。
至於回答問題的第一部分,因爲你有一個用於模的質數,你應該能夠使用散列值模表的大小來獲得一個索引(對於64位int和一個大小爲2^16的表,這只是64位散列的16個最低有效位)。至於桌子尺寸,你選擇一個足夠大的尺寸來容納所有數據加上一些備用空間(在實踐中使用0.75的負載值)。如果你期望有很多插入,你將需要提供更多的空間,否則你會一直在調整表格的大小。請注意,使用上面提到的動態哈希算法,這不是必需的,因爲所有調整大小的操作都會隨着時間的推移而攤銷。另外,請記住兩個項目可以存儲在同一個存儲桶中(在散列表中相同的散列位置),散列函數merely tells you where to start looking。所以在實踐中,你會在你的散列表的每個位置有一個條目數組。請注意,如果您使用open addressing來處理散列衝突,則可以避免這種情況。
當然,如果您選擇不同的散列函數,有時您可以做得更好。你的目標是爲你的桌子的每個尺寸設置一個perfect hash function(如果你允許重新調整大小),使用類似dynamic perfect hashing或universal hashing的東西。