散列表本质思想
- 目的:兼顾空间与时间的高效性
- 实现逻辑:以最基本的向量作为底层支撑结构,通过适当的散列函数,在词条的关键码和向量的秩之间建立起映射关系(循值访问)
- 实现结果:
- 散列表:底层逻辑,存放词条的单元/桶单元,桶单元按其逻辑顺序在物理上连续排列(散列表——>桶数组)
- 散列函数:词条与桶地址之间约定的某种映射关系(key的散列地址=hash(key))
- 冲突排解策略
- 三者——>设计得当,散列技术在期望的常数时间内实现词典的所有接口操作
- 词条数n,关键码范围r,散列表长m:r >> m > n
回答问题:散列表长的设计原则
- 逻辑联系
散列函数/映射函数的设计原则
- 必须确定/映射地址完全取决于其关键码,自身不能过于复杂/O(1)操作,尽量覆盖整个地址空间/充分利用有限空间
- 不可能是单射:r>>m
- 关键码映射到桶的概率尽量为1/m:随机性越强,规律性越弱越好
- 实际手段:先验地消除可能导致地关键码分布不均匀的因素,最大限度地模拟理想的随机函数
散列函数的设计案例:
- 除余定址法:散列表长度取作素数
- MAD定址法
散列冲突排解:找到空桶,找不到也能停止即为基本要求
- 闭散列:
- 多槽位,独立链
- 平放试探法:M为素数且装填因子<50%满足能够找到空位
- 开散列(开放定址):
- 线性试探法
综上,散列表长的设计原则:
- hash函数的设计原则:先验地消除可能导致地关键码分布不均的因素,尽可能地避免冲突
- 除余定址法:M为素数的原则
- 取模运算的冲突与模的因子相关(用等差数列验证,数列的间隔为模的因子大小时,冲突的可能性增大——>随机数列而言,模的因子更多,产生的冲突可能性就越大),素数取模的结果分布更均匀,冲突概率更小,所以选择素数作为比表长尽可能减少冲突发生符合设计原则
- 冲突排解的方法:平放试探法
- 散列表长:素数且装填因子满足<=50%时,能够找到空桶(结论1)
- 冲突排解的方法:双平方试探法
- 散列表长:素数且为4k+3,必然可以保证:查找链的前M项均互异,能够找到空桶(结论2)