数据结构Java10【哈希表概述、散列函数的设计、散列冲突解决方案】

学习地址:【数据结构与算法基础-java版】                  🚀数据结构--Java专栏🚀

目   录

P61 5.1 哈希表概述

1、哈希表概念

P62 5.2 散列函数的设计

P63 5.3 散列冲突的解决方案

1、开放地址法

1.1、线性探测法

1.2、二次探测法

1.3、再哈希法

2、链地址法


P61 5.1 哈希表概述

1、哈希表概念

百度百科:https://baike.baidu.com/item/%E5%93%88%E5%B8%8C%E8%A1%A8/5981869?fr=aladdin

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表

给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后,若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash)函数。

  • 若关键字为k,则其值存放在f(k)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数,按这个思想建立的表为散列表。

  • 对不同的关键字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),这种现象称为冲突(英语:Collision)。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数f(k)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为散列表,这一映射过程称为散列造表散列,所得的存储位置称散列地址

  • 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。

哈希表(散列表):关键字年龄,通过存储位置(取余/减去固定值),返回相应的数据。

P62 5.2 散列函数的设计

散列函数的设计:计算简单、分布均匀。 

直接定址法(直接、计算简单、不好用、分布不均匀):将关键字作为 下标(存储地址)。【电话号码,不适合!】

数字分析法:需要提前知道关键字。

平方取中法:数字进行平方运算,取中间1、2、3个数字。

随机数法:存储地址=random();

哈希表底层,使用数组。

P63 5.3 散列冲突的解决方案

散列函数:解决地址冲突问题。【数据:11、12、22、21、23】【取余法(%10)】

1、开放地址法

1.1、线性探测法

线性探测法:数据冲突,紧跟着数据 进行存储。问题:数据聚集。

1.2、二次探测法

二次探测法:解决数据聚集问题。数据所在的位置,已有数据,根据 1^2、2^2、3^2……往后放。

1.3、再哈希法

散列函数

2、链地址法

链表:无限延伸。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

upward337

谢谢老板~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值