hash表

hash: 就是 把任意长度的输入,通过hash算法,变换成固定长度的输出。也就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
hash值:不同长度的信息——(转换)——128位的编码。而这些编码值叫做hash值,hash找到一种数据内容和数据存放地址之间的映射。
hash表的设计思想:采用了函数映射的思想,将记录的 存储位置与记录的关键字关联起来从而能够很快地进行查找。(这在java中是将键值和存储之地关联)
映射函数f:key——>adreass
可以根据关键字和映射关系计算出该记录在表中的存储位置(这里的存储位置是指表中的位置,并不是实际的物理地址)称为hash地址
hash表的三要素: key 映射关系 hash地址(hash值)
----------------------------------------------------------------------
hash表设计的关键问题:
hash函数设计的好坏直接影响到对hash表的操作效率
hash表大小的确定也非常关键
案例:存储联系人信息
张三 13980593357 李四 15828662334 王五 13409821234 张帅 13890583472
设计hash函数
函数关系:姓名的每个字的拼音开头大写字母的ASCII码之和
address(张三)=ASCII(Z)+ASCII(S)=90+83=173;
    address(李四)=ASCII(L)+ASCII(S)=76+83=159;
    address(王五)=ASCII(W)+ASCII(W)=87+87=174;
    address(张帅)=ASCII(Z)+ASCII(S)=90+83=173;
这种设计的问题:
1.存储空间过大
2.address(张三)和address(李四)有相同的hash地址
hash函数设计的要点:
应该尽量考虑 关键字的分布特点 来设计函数使得 hash地址随机均匀地分布
整个地址空间当中。
常见hash函数设计:
1.直接定址法
取关键字key或者关键字的某个线性函数为hash地址, 即address(key)=a*key+b;
如知道学生的学号从2000开始,最大为4000,则可以将address(key)=key-2000作为Hash地址。
2.平方取中法
对关键字进行平方运算,然后取结果的中间几位作为Hash地址。假如有以下关键字序列{421,423,436},平方之后的结果为{177241,178929,190096},那么可以取{72,89,00}作为Hash地址。
设计hash的大小
如果Hash表的空间远远大于最后实际存储的记录个数,则造成了很大的空间浪费,如果选取小了的话,则容易造成冲突。
——需要根据最终记录存储个数和关键字的分布特点来确定Hash表的大小。
——可能事先不知道最终需要存储的记录个数,则需要动态维护Hash表的容量,此时可能需要重 新计算Hash地址。
解决冲突
开放定地址法:
即当一个关键字和另一个关键字发生冲突时,使用某种探测技术在Hash表中形成一个探测序列,然后沿着这个探测序列依次查找下去,当碰到一个空的单元时,则插入其中。比较常用的探测方法有线性探测法,比如有一组关键字{12,13,25,23,38,34,6,84,91},Hash表长为14,Hash函数为address(key)=key%11,当插入12(余1),13(余2),25(余3)时可以直接插入,而当插入23(余1)时,地址1被占用了,因此沿着地址1依次往下探测(探测步长可以根据情况而定),直到探测到地址4,发现为空,则将23插入其中。
链地址法:
采用数组和链表相结合的办法,将Hash地址相同的记录存储在一张线性表中,而每张表的表头的序号即为计算得到的Hash地址。
地址2相同的有3个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值