- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
双重散列探查法的计算公式
—、散列表的由来?
1?散列表来源于数组,它借助散列函数对数组这种数据结构进行扩展,利用的是 数组支持按照下标随机访问元素的特性。
2?需要存储在散列表中的数据我们称为键,将键转化为数组下标的方法称为散列 函数,散列函数的计算结果称为散列值。
3?将数据存储在散列值对应的数组下标位置。
二、 如何设计散列函数?
总结3点设计散列函数的基本要求
L散列函数计算得到的散列值是一个非负整数。
若 keyl=key2 ,则 hash(keyl)=hash(key2)
若 key/key2 ,则 hash(keyl)#hash(key2)
正是由于第3点要求,所以产生了几乎无法避免的散列冲突问题。
三、 散列冲突的解放方法?
1?常用的散列冲突解决方法有2类:开放寻址法(open addressing )和链表法
(chaining ) 2?开放寻址法
核心思想:如果出现散列冲突,就重新探测一个空闲位置,将其插入。
线性探测法(Linear Probing ):
插入数据:当我们往散列表中插入数据时,如果某个数据经过散列函数之后,存 储的位置已经被占用了 ,我们就从当前位置开始,依次往后查找,看是否有空闲 位置,直到找到为止。
查找数据:我们通过散列函数求出要查找元素的键值对应的散列值,然后比较数 组中下标为散列值的元素和要查找的元素是否相等,若相等,则说明就是我们要 查找的元素;否则,就顺序往后依次查找。如果遍历到数组的空闲位置还未找到, 就说明要查找的元素并没有在散列表中。
删除数据:为了不让查找算法失效,可以将删除的元素特殊标记为deleted ,当 线性探测查找的时候,遇到标记为deleted的空间,并不是停下来,而是继续 往下探测。
结论:最坏时间复杂度为0(n)
二次探测(Quadratic probing ):线性探测每次探测的步长为1 ,即在数组 中一个一个探测,而二次探测的步长变为原来的平方。
双重散列(Double hashing ):使用一组散列函数,直到找到空闲位置为止。
线性探测法的性能描述:
用装载因子来表示空位多少,公式:散列表装载因子二填入表中的个数/散 列表的长度。
装载因子越大,说明空闲位置越少,冲突越多,散列表的性能会下降。
3.链表法(更常用)
插入数据:当插入的时候,我们需要通过散列函数计算出对应的散列槽位,将其 插入到对应的链表中即可,所以插入的时间复杂度为0(1)。
查找或删除数据:当查找、删除一个元素时,通过散列函数计算对应的槽,然后 遍历链表查找或删除。对于散列比较均匀的散列函数,链表的节点个数k=n/m , 其中n表示散列表中数据的个数,m表示散列表中槽的个数,所以是时间复杂 度为0(k)。
四、思考
l.Word文档中单词拼写检查功能是如何实现的?
字符串占用内存大小为8字节,20万单词占用内存大小不超过20MB ,所以用 散列表存储20万英文词典单词,然后对每个编辑进文档的单词进行查找,若未 找到,则提示拼写错误。
2假设我们有10万条URL访问日志,如何按照访问次数给URL排序?
字符串占用内存大小为8字节,10万条URL访问日志占用内存不超过10MB , 通过散列表统计url访问次数然后用TreeMap存储散列表的元素值(作为key ) 和数组下标值(作为value )
3?有两个字符串数组,每个数组大约有10万条字符串,如何快速找出两个数组 中相同的字符串?
分别将2个数组的字符串通过散列函数映射到散列表,散列表中的元素值为次 数。注意,先存储的数组中的相同元素值不进行次数累加。最后,统计散列表中 元素值大于等于2的散列值对应的字符串就是两个数组中相同的字符串
原创力文档


文档评论(0)