哈希表(散列表)

这几天看了一些关于散列的相关知识,由于在学校时对数据结构的知识没有重视,现在对于一些常见的数据结构,如:红黑树,B,B+树等知识

只知其概念却不知其实现,现在就慢慢回炉重新进行学习。

哈希表又称散列表,是一种根据关键码值(key-value)来进行数据的查找,删除,插入等操作的数据结构。他以关键码值key为自变量,通过哈希

函数h(k)将关键码值映射到散列表中的一个地址,然后将value存储在这个地址单元中,如果需要进行数据的查找,插入,删除等操作,只要通

过哈希函数h(k)根据关键码值key映射出哈希表中的地址,就能够在相应的地址单元中取出值来。简单来说就是:理想的散列表数据结构是一个

固定大小的数组array[],如果我们要保存一个值放到这个数组当中,那么我们先定义一个唯一的关键码key,然后将这个关键码通过相应的哈希

函数计算出函数值,这个计算出的函数值恰好就是数组array所有下标中的一个,然后将我们要保存的数据保存在相应下标中的数组中,如果我

们要查找这个数据,知道关键码key,通过哈希函数就能够计算出这个数据在数组单元中的下标,那么也就能够取到这个数据了,这就是散列表

的原理。

但是如果不同的关键码key,通过散列函数计算出的函数值是一样的,而同一个数据单元只能存储一份数据,所以这就引起了冲突,即通常我们

所说的散列冲突,怎样解决这样的冲突是构建散列表结构的关键。下面介绍几种解决散列冲突的方法:

一、分离链接法:

分离链接法其做法是将散列到同一个值的所有元素保留到一个表中。

假如我们现在的关键码为0到9的完全平方数:0,1,4,9,16,25,36,49,64,81.散列函数为:h(x)=x mod 10,那么所得的散列值则分别为:0,1,4,9,6,

5,6,9,4,1.由此可见散列出来的散列值有4对是相同的,所以将这4对关键码对应的值放到4列不同的列表中。用一张图来说明:


从上面这个图可以看出,关键码49,9的哈希值是相同的,那么他们的关键码对应的值保存在表头为9,49,9的链表中,如果我们要查找,

关键码9对应的数据,那么就先找到下标为9的链表单元,然后根据表头的值找到表头内容为9的链表单元,最后找到相应的数据。以

上就是分离链接法的原理。

二、线性探测法

分离链接法由于使用到了链表,导致所需存储单元增加,同时由于还需要对哈希表之外的链表的数据结构进行实现,故不需要使用链

表解决冲突的方法就是尝试另外一些单元,直到找出空的单元为止。假如,h(x)=hash(x),x1,x2的哈希值相同,那么引入函数f(x),这

个函数就是解决冲突的方法,于是h(x) = hash(x)+f(x),其中f(x) = x。这种加入线性函数解决冲突,找到空的槽的方法就叫做线性探测

法。线性探测法会引起一次聚集的问题,这是因为由于不同的关键码的哈希值的变化是线性变化的,这样就会导致形成一些块区,下

一次探测时就会需要多次尝试才能找到空的单元。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值