因此,在计算哈希表的加载因子时是否应该包含逻辑删除的问题出现了。
我认为,鉴于负载系数用于确定何时扩展容量,不应包括逻辑删除。一个明显的例子是你几乎填充然后删除哈希表中的每个值。插入非常容易(没有碰撞),所以我认为负载因子不应该包含它们。
但是你可以看看这个,并认为所有的墓碑查找都会很慢(可能会搜索几乎整个空间)。
所以我想我会问这个问题。哈希表的加载因子是否应包含计算中的逻辑删除?
答案 0 :(得分:2)
负载因子不是哈希表数据结构的重要组成部分 - 它是为动态系统定义行为规则的方法(增长/缩小哈希表是一个动态系统)。 / p>
此外,在我看来,在95%的现代哈希表案例中,这种方式过于简化,动态系统表现不佳。它的优点是:
目标是两个主要哈希表动态行为模式:
定义了两个阈值:
max size (即活着的条目数),table size * max load
最小免费数量(即空,无活动条目或墓碑)插槽,computed by magic formula。
如果哈希表大小超过 max size ,我们假设我们处于“增长模式”,重新调整表大小以便能够存储current size * growth factor
个条目,i。即选择最接近current size * growth factor / target load
的表格大小。
如果空闲插槽的数量低于 min空闲插槽数,我们处于“缓存模式”,重新“切换到当前大小”,i。即最接近current size / target load
的表格大小。
阅读the source where all the above logics are coded。
此外,文章Tombstones purge from hashtable: theory and practice提供了一些启示。
如果你开发了专门的哈希表,哪些dymanic属性是已知的(或可以研究),我建议你开发自己的模型,适合你的情况。不要依赖纯数学和CS理论,在基准测试中评估你的模型。