数据结构之散列表

这两天做OJ发现很多题目的解法用HASH的话会方便高效很多,但是苦于数据结构这一块学的不够扎实,所以重新学习一下HASH的知识。我记得第一次接触HASH的时候是本科备战数据库考试的时候,里面提到了这么一个概念,当时是为了实现高效存储以及高效访问数据库数据的方式,但是为了应试,当时只是记下了概念没有进入深入的思考,导致现在对这个一点概念都没有。
另外,这篇文章参照的是《大话数据结构》这本书(因为《算法导论》里这章的知识没看懂)。
一.什么是散列
    简单的说:存储地址=f(关键字),关键字就是你需要存储的数据,存储地址就是数据存到哪个地方。所以散列表就是所有关键字经过f()之后得到的存储地址总和(简单的就这么理解)。
    这里和其他的数据结构需要相区别的是:对于栈,队列,树甚至是图。他们之间都有相应的逻辑关系,简而言之就是它们之间可以通过连线链起来,但是三列的话是不能简单的通过连线连接起来的,它实际是通过f()函数将关键字和存储地址链起来的。这样,当我们查询关键字的时候,我们只需要将这个关键字进行f(),然后得到的这个结果里去找需要的元素。所以说,散列是一种存储结构,又是一种查询结构。
二.有什么缺陷?
    看到散列的定义,我第一个疑惑的就是:万一两个不同的关键字A和B经过f()得到相同的值怎么办,那就意味着A和B要存在同一个地方,显然这是不允许的,而且这种情况又确实很有可能发生。其实这个就是散列当中所说的冲突问题,也是散列函数设计的是否合理的一个重要的参考。当然越好的散列函数,相应分配的地址肯定越均匀。
三.常见的散列函数.
    本文旨在介绍散列表这个数据结构,有个大致的概念,所以很多散列函数我们就简单的说一下,不作深入探讨。
    直接定址法:f(key) = a*key+b
    数字分析法:首先分析所有的数据当中有哪些是相同的,哪些又是用来区分不同数据的。比如手机号,同一个城市的话,那么就会有131ABCDXXXX(假定以131开头的)的形式,ABCD是固定的,不同的用户通过XXXX来区分。所以我们就可以以XXXX四个进行散列,而不用对整体进行散列了
    平方取中法:先对数据平方,得到的结果取中间三位
    除留余数法:f(key) = key mod p
    。。。
    还有很多方法,私底下想了解的去查资料。而且甚至你可以设计自己的散列函数。
四.解决冲突
    既然有前面说到的冲突问题,那么久应该有相应的解决方法,这里只介绍最常用的链地址法。
    假如A,B两个关键字都产生了相同的值(地址),那么现在的解决方案就是:在这个地址上既不存A也不存B,我存一个地址,这个地址指向一个链表表头,而这个链表是由A和B组成的,图解如下:![链地址法](https://img-blog.csdn.net/20150408170116870)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值