散列表 : 就是把key值通过哈希函数转换为一个整数值 然后把该值通过散列函数的设计方法得到一个值作为数组下标 把value值存储该下标对应的位置
散列函数 :
要求
散列函数计算得到的散列值必须是大于等于 0 的正整数,因为 hash 值需要作为数组的下标
如果 key1key2 ,那么经过 hash 后得到的哈希值也必相同即:hash(key1) hash(key2)
如果 key1 != key2 ,那么经过 hash 后得到的哈希值也必不相同即:hash(key1) != hash(key2)
特点
散列函数计算得出的哈希值尽可能的能随机 并且均匀的分布,这样能够将散列冲突最小化。
散列函数不能太复杂,因为太复杂度势必要消耗很多的时间在计算哈希值上,也会间接影响散列表性能。
散列函数的设计方法 :
直接寻址法 : 通过某个关键字key作为散列地址 但是由于key值不确定 所以一般很少使用该方法
除留余数法 : 例如 : 7对3取余为1 则把1作为数组下标进行查询存储
平方取中法 :
…
散列冲突 :
当通过散列函数得到的作为下标去查询数组时 发现该位置已经存在数据 此时就会发生散列冲突问题
解决 :
开放寻址法 : 一旦发生散列冲突 就重新寻找一个空的散列地址
线性检测 : 遍历数组挨个查找为空的地址
二次检测 : 类似于线性检测 区别是线性检测是一步一步查找 二次检测是原来的二次方进行查询
双重检测 : 定义多个散列函数 第一个冲突就是要第二个散列函数技术地址值 依次执行
链表法 : 如下图 可以吧数组每个下标位置称为一个 桶 每个桶对应一条链表 把所有散列值相等的元素放到对应的链表中即可