哈希表——基本概念

说明:以下内容纯属个人学习的总结,乐于分享,致力开源,欢迎转载。

一、概念

哈希表,又称为散列表,是一种根据键来直接访问内存位置的一种数据结构。它通过一个计算键值的函数(散列函数)来将所查询的数据映射到哈希表中的一个位置来查找该位置的内容,从而达到快速查找的目的。(存放记录的数组就称为哈希表)。

  1. 若关键字为k,则其值就存放在f(k)对应的位置上,这样可以实现不用比较就可以直接找到要求的记录,其中f(k)就是散列函数
  2. 冲突:对于不同的关键字可能得到相同的散列地址,这就是冲突。
  3. 若对于关键字集合中的任意一个关键字,经散列函数映射到地址集合中的任意一个地址的概率是相等的则称此类散列函数为:均匀散列函数

二、散列函数构造方式

  1. 直接定址法:取关键字或者关键字的一个线性函数值为散列地址即:hash(k) = k 或者 hash(k) = ak + b(a、b为常数),这种散列函数又称为自身函数.由于直接定址法所得的地址集合和关键字集合的大小相同,因此对于不同的关键字不会发生冲突,但是实际中能使用这种哈希函数的情况比较少;

  2. 数字分析法:假设关键字是以r为基的数,并且哈希表中可能出现的关键字都是事先知道的,则可以取关键字的若干位组成哈希地址。
    例如:假设80个关键字的一部分如下图所示:
    这里写图片描述
    可以发现:

    1. 第1和第2位都是8和1,
    2. 第3位只能取3或4,
    3. 第8位只能取2.5或者7;

    因此在取地址的时候不能取这四位(1.2.3和8)。由于中间的四位(4.5.6.7)近似于随机,因此可以选择其中两位或者其中两位和另外的两位叠加求和然后舍去进位作为哈希地址。

  3. 平方取中法:取关键字的平方后的中间几位为散列地址,位数由表长决定。这是一种比较常用的方法,通常在选定哈希函数时不一定能知道关键字的全部情况,因此去其中的哪几位不一定合适,而一个数的平方后的中间几位是和一个数的每一位都相关,由此使随即分布的关键字得到的哈希地址也是随机的;
    例如:在计算机内可用两位八进制数表示字母和数字(如下图),取标识符在计算机中的八进制数为它的关键字,假设表长为512(2^9)则可取关键字平方后中间9位二进制数【八进制为三位如图所示】为哈希地址。
    这里写图片描述

  4. 除留余数法:取关键字被某个不大于哈希表表长m的数p除后取得的余数为散列地址即:hash(k) = k mod p (p < m)。这是一种最常用的方法获取哈希地址,可以直接对关键字取模,也可以先对关键字平方等运算之后再取模。
    注意:在使用该方法时一定要注意p的选择,p选择不好很容易产生冲突如下几例

    1. 假设取标识符在计算机中的二进制表示为它的关键字(每个字母都用两位八进制数表示),然后对p = 2^6取模,相当于将关键字左移直至只留下最低的6位二进制数。这样的算法问题所在:最后一个字符相同的所有标识符都会产生冲突;
    2. 若p含有质因子pf,则所有含有pf因子的关键字的哈希表地址都是pf的倍数;
      总结:一般来说,p可以选择为质数或者不包含小于20的质因数的合数
  5. 随机数法:通常用于关键字长度不等时采用。

三、冲突处理

处理冲突就是为冲突的关键字找到另一个空的哈希地址,如果在找到下一个哈希地址时仍然冲突就再找下一个地址,一直到找到不冲突为止!

处理冲突的方法有以下几种:

  1. 开放定址法其中是散列函数,m是散列表长,这里写图片描述是增量序列,i是发生冲突的次数;其中增量序列这里写图片描述的获取方法有:

     - 线性探测:这里写图片描述即:这里写图片描述相当于逐个探测存放地址的表,直到查找到一个空单元,把散列地址存放在该空单元。
     
     - 平方探测:这里写图片描述;相当于发生冲突时探测间隔这里写图片描述个单元的位置是否为空,如果为空,将地址存放进去。
     
     - 伪随机探测: 这里写图片描述是伪随机序列

  2. 单独链表法:将散列到同一个存储位置的所有元素保存在一个链表中。

  3. 再散列法这里写图片描述是一些散列函数;即在上次散列计算发生冲突时,利用该次冲突的散列函数地址产生新的散列函数地址,直到冲突不再发生。

参考文献:
【1】维基百科:散列表
【2】数据结构(C语言版):严蔚敏

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值