1. 多槽位(multiple slots)
(1)桶单元细分成若干槽位slot,存放(与同一单位)冲突的词条
一个长度为23的散列表,每一个桶都被分成了3个槽位,将24个词条插入其中。进行查找时,除了需要根据关键码确定对应的桶单元地址,还需在桶中遍历所有的槽位。
(2)
- 只要槽位数目不多,依然可以保证O(1)的时间效率。
- 槽位预留过多,空间浪费
- 无论预留多少,极端情况下仍有可能不够
2. 独立链(Linked-list chaining/separate chaining)
(1).每个桶存放一个指针。冲突的词条,组织成列表。
(2)
优点:
- 无需为每个桶预备多个槽位
- 任意多次的冲突都可解决
- 删除操作实现简单,统一
缺点:
- 指针需要额外空间
- 节点需要动态申请
- 空间未必连续分布,系统缓存几乎失效
3. 开放定址法(open addressing~closed hashing)
- 为每个桶都事先约定若干备用桶
- 散列表所占用的空间在物理上始终是地址连续的一块
- 它们构成一个查找链probing sequence试探队列/chain
4. 线性试探
- 在线性试探中,一旦发生冲突,转而试探当前位置的后继
- 存在大量本不该发生的冲突
- 试探位置间距太近
5. 懒惰删除
6. 平方试探
- 适当加大试探间距
- 以平方数为距离,确定下一试探桶单元
- 当表的长度为素数时,为了使平方试探总是成功,装填因子需要少于50%
优点:
- 数据聚集现象有所缓解
- 查找链上,各桶间距线性递增。一旦冲突,可逃离是非之地
缺点:若涉及外存,I/O将激增。有空桶也不一定能试探出来。
7. 双向平方试探