u8,u8国际,u8国际官方网站,u8国际网站,u8国际网址,u8国际链接,u8体育,u8体育官网,u8体育网址,u8注册,u8体育网址,u8官方网站,u8体育APP,u8体育登录,u8体育入口
Hash表也称散列表,也有直接译作哈希表,Hash表是一种特殊的数据结构,它同数组、链表以及二叉排序树等相比较有很明显的区别,它能够快速定位到想要查找的记录,而不是与表中存在的记录的关键字进行比较来进行查找。这个源于Hash表设计的特殊性,它采用了函数映射的思想将记录的存储位置与记录的关键字关联起来,从而能够很快速地进行查找。
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
假如对上述的联系人信息进行存储时,采用的Hash函数为:姓名的每个字的拼音开头大写字母的ASCII码之和。
首先,它浪费了大量的存储空间。因为假如采用char型数组存储联系人信息的线个字节来存储。
另外,根据Hash函数计算结果之后,address(张三)和address(张帅)具有相同的地址,这种现象称作冲突,对于174个存储空间中只需要存储4条记录就发生了冲突,这样的Hash函数设计是很不合理的。所以在构造Hash函数时应尽量考虑关键字的分布特点来设计函数使得Hash地址随机均匀地分布在整个地址空间当中。
对关键字进行平方运算,然后取结果的中间几位作为Hash地址。假如有以下关键字序列{421,423,436},平方之后的结果为{177241,178929,190096},那么可以取中间的两位数{72,89,00}作为Hash地址。
将关键字拆分成几部分,然后将这几部分组合在一起,以特定的方式进行转化形成Hash地址。假如知道图书的ISBN号为8903-241-23,可以将address(key)=89+03+24+12+3作为Hash地址。
如果知道Hash表的最大长度为m,可以取不大于m的最大质数p,然后对关键字进行取余运算,address(key)=key%p。
在这里p的选取非常关键,p选择的好的话,能够最大程度地减少冲突,p一般取不大于m的最大质数。
然后我们再添加进去一个K3,如果他和K2的哈希冲突了就会形成如下图这样。这样就会形成一个链表。
除了链地址法解决哈希冲突外,还有很多种可以解决哈希冲突的方法,这里再说一下开放地址发。意思就是每一个地址都对所有的元素是开放的。
我们如果要添加一个31,发现它和11的哈希值发生了冲突,这个时候他会去找11下一个索引为空位的地方来存放。结果就是放在了2的位置。
这就是开放地址法中的线性探测法,遇到哈希冲突+1。但是这个方法性能并不高,因为如果有一片都冲突了,要不停的往下去寻找。
另一种就是平方探测法,具体就是先+1去找如果+1冲突了直接就+4去找还冲突就是+9、+16。