哈希表线性探测删除疑问:删除元素97是否需调整数组大小?
线性探测哈希表删除操作的正确姿势
嘿,刚好对线性探测哈希表的实现比较熟,来帮你拆解这个问题~
首先得明确一个核心点:线性探测哈希表不能直接把删除的位置设为empty!为啥?因为线性探测是靠连续的非空位置维持探测链的,如果直接把97的位置置空,后续查找比如49、50这些因为哈希冲突被放到后面的元素时,查到这个empty位置就会误以为元素不存在,直接终止查找了,这就破坏了整个哈希表的结构。
正确的做法是用懒删除(Lazy Deletion):给这个位置标记一个特殊状态,比如deleted(区别于empty),这样后续的查找、插入操作遇到deleted时会继续沿着探测链走,不会中断。
然后说你关心的数组大小调整问题:
- 之前扩容是因为负载因子(元素数N / 数组容量M)过高(≥M/2),冲突概率飙升,所以扩容到两倍来降低负载。
- 但删除元素后要不要缩容,要看你设定的缩容阈值。一般不会一删除就缩容,否则会频繁触发扩容/缩容的操作(性能损耗极大),通常会设置一个更低的阈值,比如当N ≤ M/4时,再把数组缩为原来的一半。
回到你的例子:
原数组的元素数N是8(数一下:37、97、50、49、38、45、57、46),数组容量M是12。删除97后N变成7,负载因子≈7/12≈0.58,远高于M/4(也就是3),所以完全不需要调整数组大小。
最后给你整理下具体操作步骤:
- 找到元素97所在的数组索引(也就是索引2)
- 将该位置的状态从存储97改为标记为
deleted(而不是empty) - 不需要做数组扩容/缩容操作
内容的提问来源于stack exchange,提问作者João
相关产品推荐
相关产品推荐

