好记性不如烂笔头~
哈希表又名散列,能够在O(1)的预期内完成对字典的获取插入和删除操作。
哈希表hash table,记为ht,每个ht有b个桶,记为ht[1].....ht[b-1]。每个桶由s个槽组成,每个槽可以放置一条记录。
关键字为K 的一个记录的地址或位置由哈希函数h确定,h(k)为k的哈希地址。
定义:关键字密度n/t,n是哈系表中记录的数目,t是所有可能的关键字数目。
装填密度或者装填因子a为n/sb。
1.1 构造哈希表
构造哈希表的方法是:设要存储的数据元素个数为 n,设置一个长度为m(m≥n)的连续内存单元(即数组),分别以每个数据元素的关键字Ki(0≤i≤n-1)为自变量,以哈希函数h(Ki)值为该数据元素在数组中的下标值存储该数据元素。
//抄的http://blog.youkuaiyun.com/yigelangmandeshiren/article/details/8257012 写的很不错
1.2 哈希函数
要求是即容易计算又能够将冲突数目最小化
1.除留余数法。应用最广泛。
关键字是非负整数,通过模运算取得初始存储桶。
h(k)=k%D
D要取20以上的质数。这样分配是相当均匀的。
2.平方取中法
3.折叠法
4.数字分析法
数字分析法是取数据元素关键字中某些取值较均匀的数字位构造哈希函数的方法。它只适合于所有关键字值已知的情况。
1.3 溢出/冲突处理
最常用的有开放定址法和链地址法。
1.开放定址法
线性探测法:s=1;
1)计算h(k); 2)以 ht[ (h(k)+j)%b] 依次顺序找
均匀的哈希函数与现行探测同时使用,查询一个关键字的平均比较次数的期望是(2-a)/(2-2a). a是装填因子
2.链地址法
若有数字,每个桶指向链表的第一个节点。搜寻平均比较次数的期望是1+a/2。
无论什么方法,最坏情况下比较次数都是O(n).