HashTable哈希表/散列表(线性探测和二次探测)

本文介绍了哈希表的基础知识,包括直接定址法和除留余数法。讨论了哈希冲突及其解决方案,重点探讨了线性探测法和二次探测法在解决冲突时的工作原理,并分析了它们的效率与载荷因子的关系。
摘要由CSDN通过智能技术生成
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/simplehap/article/details/70577454

HashTable的简单介绍

HashTable是根据关键字直接访问在内存存储的数据结构。
HashTable叫哈希表或者散列表。
它通过一个关键值的函数将所需的数据直接映射到表中的位置来访问数据,这个映射函数叫散列函数(哈希函数),存放记录的数组叫散列表(哈希表)。

比如:
给定一字符串“abckhdgubhkacdggk”找出第一次只出现一次的字符。
对于这个问题,用指针解决,用两个指针,一个指针cur指向当前字符,另一个指针next向后遍历,如果找到cur与next相同,cur指向下一个字符,next再进行遍历,直到next遍历完成所有字符,都与cur不同,则此时的cur指向的字符就是第一个只出现一次的字符。时间复杂度O(n^2)。

这种方法可以解决但是时间复杂度比较高,优化一下,在查找时红黑树和堆排序的查找时间复杂度会低一点,建红黑树然后再根据关键字进行查找。时间复杂度O(nlogn)。

能不能再优化一下?
那就是运用到哈希表,所有字符总共256个,我们可以利用字符对应的ASCII值为下标建立数组。遍历一遍字符串,将每个字符对应的下标ASCII处加1,遍历完成后就从头往后进行查找,查找时直接能找到对应的位置。所以这个时间复杂度就为O(n)。

这就是哈希表的直接定址法。

当对一组10以内的数进行排序,也可以用哈希表。比如:1、3、5、2、5、3、5、8,建立一个数组a[10],将对应的数存放在对应的下标处,出现一次加一下,打印时如果下标对应的是0就不打印,对应1就打印1次,对应的下标里存几就打印几。如下:
这里写图片描述
但是并不是所有的数都适合这种排序,如:1000、1002、1000、1005、1000、1008。最大数是1008,开1008大小的数组前1000个就浪费了,我们只需开(1008 - 1000)的大小就好,对应的下标就是(1008-1000)/1000。
这就是哈希表的除留余数法。

除此外,构造哈希表的方法还有:平方取中法、折叠法、随机数法、数学分析法


哈希冲突(哈希碰撞)

不同的关键字通过相同的哈希函数处理后可能产生相同的值哈希地址。我们称这种情况为哈希冲突或哈希碰撞。(任意的散列函数都不能避免产生

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值