关于散列表的笔记
概述
散列技术实在记录的存储位置和它的关键字之间建立一个确定的对应关系f使得每个关键字key对应一个存储位置f(key)。
散列原则
1、计算简单
计算如果过于复杂,那么也会产生性能问题。
2、散列分布均匀
分布均匀的散列查询也会有益于查询减小查询长度。
散列的构造方法
1、直接定址法
取某个关键的线性函数的值为散列值。适用于量比较少的情况。
2、数字分析法
主要是分析数字然后抽取。
3、平方取中法
4、折叠法
距离将一个关键字987654321分为四组之后再叠加求和
5、除留余数法
6、随机数法
处理散列冲突的方法
1、开放定址法
开放定址法 就是一旦发生了冲突,就回去寻找下一个空的散列地址。
f(key) = (f(key)+di)MOD m;
以上解决冲突的开放定址法称为线性探测法。
di的函数如果是平方的话,那么叫做二次探测法
2、在散列函数法
就是当一个散列函数失败之后更换另一个散列函数.
3、链地址法
就是冲突之后直接在冲突后面,用链表连接好。
4、公共区溢出法
就是如果冲突就去溢出表内进行查找。
散列的性能分析
1、散列函数是否均匀。
2、如何处理冲突。
3、散列的装填因子
散列的装填因子=填入表中的记录个数/散列表长度
如何计算平均查找长度
平均查找长度=走过的节点路径综合/总结点数
1.顺序查找:
等概率条件下
平均查找长度:ASL = (n+….+2+1)/n= (n+1)/2。
2.二分法查找:
平均查找长度:ASL = log2(n+1)-1。
原因:用二叉树来描述,树的高度d与节点树的关系为:n=(1+2+4+…… 2^(d-1))=2^d - 1;所以d = log2(n+1),每一层只需要比较一次,所以最多需要比较log2(n+1)次。
3.分块查找:
又称索引顺序查找,由分块有序(每一块中的关键字不一定有序,但是前一块中的最大关键字必须小于后一块中的最小关键字,即分块有序。)的索引表和线性表组成。例如把r【1….n】分为 b 块,则前 b-1 块节点数为 s = 【n/b】,最后一块允许小于或等于s。索引表是一个递增有序表。
平均查找长度分为两部分,索引表的查找+块内的查找。(索引表能够用二分法和顺序查找,块内无序,所以只能用顺序查找)
如果以二分查找来确定块,则 ASL = log2(b+1)-1 + (s+1)/2。
如果以顺序查找来确定块,则 ASL = (b+1)/2 + (s+1)/2。
如果以哈希查找来确定块,则ASL=1 + (s+1)/2。