簡體   English   中英

單獨鏈接中的負載系數?

[英]load factor in separate chaining?

為什么建議在單獨鏈接中將負載因子設為 1?

我看到很多人說它是推薦的,但沒有給出明確的解釋原因

在開放尋址中,我知道負載因子應該在 0.5 到 0.7 之間,因為在處理沖突時找到未占用的索引應該是一個快速的操作。 但我不明白為什么在單獨鏈接中負載因子為 1 應該更好。 我的意思是,如果我有一個大小為 100 的表,是否還有機會將所有 100 個元素散列到相同的索引並放在同一個列表中? 天啊,我真的無法理解為什么這個單獨鏈接的特定負載因子應該是 1。

tl; dr:通過占用插槽來節省內存空間通過最小化列表遍歷操作的數量來加快訪問速度。

如果您將負載因子理解為n_used_slots / n_total_slots

負載因子為 1只是描述了使用分離鏈沖突處理的良好實現的哈希表的理想情況:沒有空槽。

另一種經典方法,開放尋址,要求表在添加新項目時始終有可用的空閑槽。 為每個項目調整表格大小的成本太高了,但我們也受到內存限制,不希望周圍有太多未使用的插槽。 必須在速度(很少調整表大小、快速插入和查找)和內存(很少有空槽)之間找到平衡點(在編程中如此頻繁)。 理想的負載因子就是基於這種平衡的思想,可以根據實際的哈希函數、值域等因素來估計。

另一方面,使用分離鏈,我們通常從一開始就期望擁有(方式)比可用哈希表槽更多的項目。 如果發生沖突,我們需要將項目添加到存儲在特定插槽中的鏈表中。 由於在鏈表中搜索成本很高,因此我們希望最小化列表遍歷操作。 為此,最好的情況是讓所有插槽都充滿理想情況下相同長度的列表! 填充所有插槽對應的負載因子為 1。

換句話說:負載因子 < 1 意味着有空槽並且項目必須添加到另一個槽中的鏈表中,增加了列表遍歷操作的次數並浪費了一些內存。

關於大小為 100 的表格示例:是的,所有項目都有可能發生碰撞並僅占用一個插槽。 在這種情況下,有效負載因子將為 0.01,性能將受到嚴重影響。

如果您將負載因子理解為n_items / n_total_slots

在這種情況下,加載因子可以大於 1。因子 < 1 表示您有空槽,而因子 > 1 表示有多個槽包含多個項目,因此需要遍歷列表。 在第一種情況下,您正在浪費空間,而在第二種情況下,列表遍歷會導致(小)性能下降,具體取決於列表的大小。

示例:負載因子為 10 意味着平均每個插槽可容納 10 個項目。 因此,搜索一個項目意味着平均遍歷 5 個列表節點。

負載因子為 1 意味着您不浪費空間並擁有最快的查找,如果您使用體面的哈希函數來確保插槽的定期和均衡使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM