哈希表简介

相信学计算机的同学对哈希表都不陌生,但由于它的重要性,我还是在这里介绍一下,算是一个复习。

哈希表是一种在插入,删除,搜寻上等操作上具有“常数时间平均时间"(当然是指统计表现上)的数据结构,这种表现不需要依赖元素的随机性。

哈希表的核心是映射函数,即散列函数,常用的散列函数稍后介绍(我见过一些相当奇怪的映射函数,不知道创造的人是怎么想的,可能我数学基础还是太差了,无法设计出那种很神奇的映射函数,比如redis的底层数据结构hash中就有用到一种古怪的哈希函数),我们先来解决另一个问题:碰撞问题(不同的元素被映射到相同的位置,比如采用映射函数y = x^2,那么-1和1的映射结果是相同的,这就很麻烦了。为了解决碰撞问题,我们常用的方法有如下几种:

1.开放定址法

这种方法也称再散列法,其基本思想是:当关键字key的哈希地址p=H(key)出现冲突时,以p为基础,产生另一个哈希地址p1,如果p1仍然冲突,再以p为基础,产生另一个哈希地址p2,…,直到找出一个不冲突的哈希地址pi ,将相应元素存入其中。这种方法有一个通用的再散列函数形式:
          Hi=(H(key)+di)% m   i=1,2,…,n
    其中H(key)为哈希函数,m 为表长,di称为增量序列。增量序列的取值方式不同,相应的再散列方式也不同。主要有以下三种:
    线性探测再散列
        dii=1,2,3,…,m-1
        这种方法的特点是:冲突发生时,顺序查看表中下一单元,直到找出一个空单元或查遍全表。
    二次探测再散列
        di=12,-12,22,-22,…,k2,-k2    ( k<=m/2 )
        这种方法的特点是:冲突发生时,在表的左右进行跳跃式探测,比较灵活。
    伪随机探测再散列
        di=伪随机数序列。
        具体实现时,应建立一个伪随机数发生器,(如i=(i+p) % m),并给定一个随机数做起点


2.开链法:这种方法是在每一个表格中分配一个list,然后我们在那个list上执行插入,查找,删除,如果list不太长,即同一个位置上的冲突不要发生特别多,速度还是可以接受的。下面是我从网上随便找的一张形象地描述开链法的图:



 

3.再哈希法

这种方法是同时构造多个不同的哈希函数:
    Hi=RH1(key)  i=1,2,…,k
当哈希地址Hi=RH1(key)发生冲突时,再计算Hi=RH2(key)……,直到冲突不再产生。这种方法不易产生聚集,但增加了计算时间。

4.建立公共溢出区

这里对这个方法不做介绍

接下来再来介绍一下Hash表的平均查找长度

  Hash表的平均查找长度包括查找成功时的平均查找长度和查找失败时的平均查找长度。

  查找成功时的平均查找长度=表中每个元素查找成功时的比较次数之和/表中元素个数;

  下面举个我从网上借鉴的例子:

  有一组关键字{23,12,14,2,3,5},表长为14,Hash函数为key%11,则关键字在表中的存储如下:

  地址     0     1     2     3      4     5    6   7   8    9  10   11   12    13

  关键字        23    12   14     2     3    5

 比较次数         1      2    1     3     3     2

  因此查找成功时的平均查找长度为(1+2+1+3+3+2)/6=11/6;

  查找失败时的平均查找长度为(1+7+6+5+4+3+2+1+1+1+1+1+1+1)/14=38/14;

  另外再介绍一下负载系数:表中元素个数除以表格大小。

      改天介绍下哈希表的具体代码实现。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值