哈希表底层数组用固定长度数组实现,推荐容量为大于预期元素数的最小素数,并以Empty/Deleted/Valid三态标记位置;冲突时线性探测(循环查找下一空位);删除设Deleted态避免断裂探测链;负载因子超0.7时扩容至两倍并重哈希有效元素。

哈希表底层数组怎么组织
哈希表底层通常用一个固定长度的数组实现,每个位置存一个键值对(或仅键+状态标记)。数组大小不是随意定的——推荐选**大于预期元素数的最小素数**,比如要存10个数,选11或13;若选合数(如12),余数分布容易偏斜,冲突概率上升。数组初始化时,所有位置标记为Empty(空),不能直接用0或-1代替,因为0可能是合法键值,必须用独立状态区分“未使用”和“值为0”。
线性探测怎么处理冲突
当两个不同键经哈希函数算出同一地址(比如都映射到索引5),就发生冲突。线性探测不建链表,而是从该地址开始,逐个检查后续位置:
• 地址5已被占 → 查6
• 地址6也被占 → 查7
• 地址7为空 → 插入此处
关键点是“循环探测”:查到末尾(如索引12)后自动回到开头(索引0),避免越界。代码中常用 (current + 1) % table_size 实现。
删除操作为什么不能真删
直接把某位置设为空(Empty)会破坏探测链。例如键A、B、C依次插入,因冲突落在[5][6][7];若删掉B(置[6]=Empty),之后查C时走到[6]就停止,误判“C不存在”。正确做法是设为Deleted(已删除)状态。这样插入时可复用该位置,查找时则继续往后探,保证逻辑连贯。
负载因子和扩容怎么配合
负载因子 = 当前元素数 / 数组总长。一旦超过0.7,聚集效应明显,查找平均比较次数陡增。此时需扩容:
• 新建两倍大小的数组
• 将原数组中所有Valid(有效)元素重新计算哈希地址,插入新表
• 注意跳过Deleted位置,不复制它们
扩容后负载因子回落,性能恢复。实际编码中,可在每次插入前检查,触发自动扩容。










