关于Hash表,你不得不知道的知识点

2024-05-12 17:12

本文主要是介绍关于Hash表,你不得不知道的知识点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

定义:

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

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

基础概念:

  • 若关键字为k,则其值存放在f(k)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数,按这个思想建立的表为散列表。对于查找一个特定的key,我们仅仅需要进行常数次的运算(考虑到hash冲突)即可得到key对应的位置,因此hash表的查找复杂度为O(1)。

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

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

哈希函数:

将关键字映射为hash地址是通过哈希函数来实现的,不同的hash函数

通过将关键字(key)映射到表中一个位置, 可以直接访问记录, 以提高查找的速率,相比较其他的查找结构,哈希表查找的时间复杂度更低。其中用于映射的函数称为哈希函数, 哈希函数有多种,常见的哈希函数包括CRC32,MD5,SHA等。其实哈希函数就是一种特殊的函数,通过输入x,得到唯一的f(x),从而实现尽可能地降低对key对应得hash值得重复问题,减少哈希冲突发生的概率。

常见的hash函数有:

1.直接寻址法:取关键字或关键字的某个线性函数值为散列地址。

2. 数字分析法:分析一组数据,比如一组员工的出生年月日,这时就会发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。

3.平方取中法:当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。 

哈希冲突:

哈希冲突就是两个不同的key,经过哈希函数运算之后,得到了相同的hash值,再对值进行存储时,发现要存储的地址空间已被他值占用,此时发生冲突问题。产生哈希冲突的原因并不是因为我们选取的哈希函数不合理,而是因为我们进行运算的键key,可能性太多了,总会存在一些情况导致hash值出现相同。所以说,hash冲突时必然的,我们需要对哈希冲突进行处理。

小李和小王通过哈希函数的运算之后,映射到了哈希表下标为1的同一位置,此时发生hash碰撞。

常见解决方案:

拉链法

刚刚小李和小王在索引1的位置发生了冲突,发生冲突的元素都被存储在链表中。 这样我们就可以通过索引找到小李和小王了。这种解决哈希碰撞的方法就是拉链法,将发生碰撞的下标使用链表链接起来。

哈希表4

(数据规模是dataSize, 哈希表的大小为tableSize)

其实拉链法就是要选择适当的哈希表的大小,这样既不会因为数组空值而浪费大量内存,也不会因为链表太长而在查找上浪费太多时间。

线性探测法

使用线性探测法,一定要保证tableSize大于dataSize。 我们需要依靠哈希表中的空位来解决碰撞问题。

例如冲突的位置,放了小李,那么就向下找一个空位放置小王的信息。所以要求tableSize一定要大于dataSize ,要不然哈希表上就没有空置的位置来存放 冲突的数据了。如图所示:

哈希表5

应用:

我们在写项目或者做算法的过程中,经常会使用到基于hash表实现的数据结构,对程序中的数据进行存储,以下是hash表常见的使用场景:

  1. 数据统计:一个字符或者数字出现了几次,
  2. 快速查找:快速查找某一个键对应着值的情况。

这篇关于关于Hash表,你不得不知道的知识点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983233

相关文章

嵌入式软件工程师应聘知识点

嵌入式软件工程师应聘 修改浏览权限 | 删除 数据结构(C语言)部分常考的知识点: 1、局部变量能、全局变量和静态变量 2、堆和栈 3、Const、volatile、define、typedef的用途 4、链表(比如链表的插入、删除和排序) 5、排序(考查冒泡法的较多) 6、可重入函数 、malloc函数 7、指针(常考函数指针,函数指针,数组指针,指针数组和

数据库期末复习知识点

A卷 1. 选择题(30') 2. 判断范式(10') 判断到第三范式 3. 程序填空(20') 4. 分析填空(15') 5. 写SQL(25') 5'一题 恶性 B卷 1. 单选(30') 2. 填空 (20') 3. 程序填空(20') 4. 写SQL(30') 知识点 第一章 数据库管理系统(DBMS)  主要功能 数据定义功能 (DDL, 数据定义语

说一说三大运营商的流量类型,看完就知道该怎么选运营商了!

说一说三大运营商的流量类型,看完就知道该怎么选运营商了?目前三大运营商的流量类型大致分为通用流量和定向流量,比如: 中国电信:通用流量+定向流量 电信推出的套餐通常由通用流量+定向流量所组成,通用流量比较多,一般都在100G以上,而且电信套餐长期套餐较多,大多无合约期,自主激活的卡也是最多的,适合没有通话需求的朋友办理。 中国移动:通用流量+定向流量 移动推出的套餐通常由通用流量+定向

项目总结-前端路由hash和history

项目总结-前端路由hash和history router模块 路由需要实现的功能 当浏览器地址发生变化的时候,切换页面点击浏览器后退前进的时候,网页内容发生变化刷新浏览器,网页加载当前路由对应内容 路由主要是通过监听事件,并利用js实现动态改变网页内容,有两种实现方式 hash模式:监听浏览器地址hash地址的变化,执行相应的js切换网页history模式:利用history API实现

poj 3882(Stammering Aliens) 后缀数组 或者 hash

后缀数组:  构建后缀数组,注意要在字符串莫末尾加上一个没出现过的字符。然后可以2分或者直接扫描,直接扫描需要用单调队列来维护 VIEW CODE #include<cstdio>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<string

UVA - 12206 Stammering Aliens (hash)

这题其实很容易想到2分长度,关键是2分后,怎么判断出现最多次的串是否》=m次了。这里需要用到hash来处理。 对于一个字符串   H[i] =H[i+1]*131+s[i]  ;其中 H[n]=0;那么对于一个长度为L的串 ,hanh[i,l]=H[i]-H[i+L]*x^L ; 这样记录每个字符串的hash值,然后再处理起来就比较简单了。 VIEW CODE #include<

408计算机网络知识点——第四章 网络层

文章目录 网络层概述分组转发和路由选择分组转发路由选择 网络层向上层提供的两种服务面向连接的虚电路服务无连接的数据报服务 网际协议IP网际协议IP异构网络互连IPv4地址及其编址方法IPv4地址概述IPv4地址的表示方法分类编址A类地址B类地址C类地址特殊地址 划分子网子网掩码默认子网掩码 无分类编址地址掩码CIDR地址块路由聚合 IPv4地址的应用规划采用定长的子网掩码进行子网划分采用

GUI (图形界面)知识点

一:组件知识点 JTextField:    作用:  定义文本域,只支持单行输入。                使用:  定义文本域:  JTextField jtf=new JTextField(20); //20为列数(列:近似平均字符宽度,它与平台有关)                        获取值:      String jtfText=jtf.getText();

最优二叉树(哈夫曼树)知识点

路径:在一棵树中从一个结点往下到孩子或孙子结点之间的通路 结点的路径长度:从根节点到该节点的路径上分支的数目 树的路径长度:树中每个结点的路径长度之和 结点的权:给树中的结点赋予一个某种含义的值,则该值为该节点的权 结点的带权路径长度:结点的路径长度乘以结点的权 树的带权路径长度(WPL):树中所有叶子结点的带权路径长度 (Weight Path Length)   最优二叉树(哈夫

面试:关于word2vec的相关知识点Hierarchical Softmax和NegativeSampling

1、为什么需要Hierarchical Softmax和Negative Sampling 从输入层到隐含层需要一个维度为N×K的权重矩阵,从隐含层到输出层又需要一个维度为K×N的权重矩阵,学习权重可以用反向传播算法实现,每次迭代时将权重沿梯度更优的方向进行一小步更新。但是由于Softmax激活函数中存在归一化项的缘故,推导出来的迭代公式需要对词汇表中的所有单词进行遍历,使得每次迭代过程非常缓慢