【软考】哈希表

目录

        • 一、概念
          • 1.1 定义
        • 二、哈希函数的构造方法
          • 2.1 说明
          • 2.2 特性
        • 三、处理冲突的方法
          • 3.1 说明
          • 3.2 开放定址法
            • 3.2.1 说明
            • 3.2.2 线性探测
          • 3.3 链地址法
          • 3.4 再哈希法
          • 3.5 建立公共溢出区
        • 四、哈希表的查找
          • 4.1 查找过程
          • 4.2 查找特点
          • 4.3 装填因子

一、概念
1.1 定义
  • 1.一般存储结构由于记录在存储结构中的相对位置是随机的,查找时通过一系列与关键字的比较才能确定被查记录在表中的位置。
  • 2.哈希表则通过计算一个以记录的关键字为自变量的函数(称为哈希函数)来得到该记录的存储地址。
  • 3.哈希表中进行查找时,需用同一哈希函数计算得到待查记录的存储地址,然后到相应的存储单元去获得有关信息再判定查找是否成功。
  • 4.根据设定的哈希函数H(key)和处理冲突的方法,将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的像作为记录在表中的存储位置,这种表称为哈希表,这一映射过程称为哈希造表散列,所得的存储位置称为哈希地址散列地址
  • 5.对于某个哈希函数H和两个关键字K1和K2,如果K1≠K2,而H(K1)=H(K2),则称为冲突
  • 6.具有相同哈希函数值的关键字对该哈希函数来说称为同义词
  • 7.冲突只能尽可能减少而不能完全避免,因为哈希函数是从关键字集合到地址集合的映像。
  • 8.通常关键字集合比较大,它的元素包含所有可能的关键字,而地址集合的元素仅为哈希表中的地址值。
  • 9.一般情况下,哈希函数是一个压缩映像,冲突是不可避免的。
二、哈希函数的构造方法
2.1 说明
  • 1.常用的哈希函数构造方法有直接定址法、数字分析法、平方取中法、折叠法、随机数法和除留余数法等。
2.2 特性
  • 1.哈希函数应是一个压缩映像函数,它应具有较大的压缩性,以节省存储空间。
  • 2.哈希函数应具有较好的散列性,虽然冲突是不可避免的,但应尽量减少。
  • 3.要减少冲突,就要设法使哈希函数尽可能均匀地把关键字映射到存储区的各个存储单元,这样就可以提高査找效率。
  • 4.在构造哈希函数时,一般都要对关键字进行计算,且尽可能使关键字的所有组成部分都能起作用。
三、处理冲突的方法
3.1 说明
  • 1.解决冲突就是为出现冲突的关键字找到另一个“空”的哈希地址。在处理冲突的过程中,可能得到一个地址序列 H(i=1,2,…,k)。
3.2 开放定址法
3.2.1 说明
  • 1.Hi=(H(key)+di)%m i=1,2,…,k (k ≤ m-1)其中,H(key)为哈希函数,m为哈希表表长
  • 2.常见的增量序列有:线性探测再散列di=1,2,3,…,m-1;二次探测再散列di=12,-12,22,-22,…,±k2(k≤m/2);随机探测再散列di=伪随机数序列
3.2.2 线性探测
  • 1.最简单的产生探测序列的方法是进行线性探测,也就是发生冲突时,顺序地到存储区的下个单元进行探测。
  • 2.例如,某记录的关键字为 key,哈希函数值 H(key)。若在哈希地址j发生了冲突(即此位置已存放了其他记录),则对哈希地址j+1进行探测,若仍然有冲突,再对地址 j+2 进行探测,依此类推,直到找到一个“空”的单元并将元素存入哈希表。
  • 3.线性探测法可能使第i个哈希地址的同义词存入第 i+1 个哈希地址,这样本应存入第 i+1个哈希地址的元素变成了第 i+2个哈希地址元素的同义词
  • 4.线性探测法的优点:思路清楚,算法简单
  • 5.线性探测法的缺点:① 溢出处理需另编程序。一般可另外设立一个溢出表,专门用来存放上述哈希表中放不下的记录。实现溢出表最简单的结构是顺序表,查找方法可用顺序查找。② 线性探测法很容易产生聚集现象。所谓聚集现象,就是存入哈希表的记录在表中连成一片。当哈希函数不能把关键字很均匀地散列到哈希表中时,尤其容易产生聚集现象,这种情况下会增加探测的次数,从而降低了查找效率。
  • 6.用户可以采取多种方法减少聚集现象的产生,二次探测再散列和随机探测再散列是两种有效的方法。
3.3 链地址法
  • 1.也叫拉链法。
  • 2.在查找表的每个记录中增加一个链域,链域中存放下一个具有相同哈希函数值的记录的存储地址。
  • 3.利用链域把发生冲突的记录链接在一个链表中
  • 4.当链域的值为null,表示已没有后继记录
  • 5.对于发生冲突时的查找和插入操作和线性表一样
3.4 再哈希法
  • 1.Hi=RHi(key)(i=1,2,…,k)
  • 2.RHi均是不同的哈希函数,即在同义词发生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。这种方法不易产生聚集现象,但增加了计算时间。
3.5 建立公共溢出区
  • 1.发生冲突,都填入到公共溢出区中。
四、哈希表的查找
4.1 查找过程
  • 1.在哈希表中进行查找操作时,用与存入元素时相同的哈希函数和冲突处理方法计算得到待查记录的存储地址,然后到相应的存储单元获得有关信息再判定查找是否成功。
4.2 查找特点
  • 1.哈希表在关键字与记录的存储位置之间建立了直接映像,由于冲突,使得哈希表的查找过程仍然是一个给定值和关键字进行比较的过程。所以需要以平均查找长度衡量哈希表的查找效率。
  • 2.在查找过程中需要和给定值进行比较的关键字的个数取决于三个因素:哈希函数、处理冲突的方法和哈希表的装填因子。
4.3 装填因子
  • 1.装填因子的定义
    在这里插入图片描述
  • 2.α标志着哈希表的装满程度。
  • 3.α越小,发生冲突的可能性越小;α越大,表中已填入的记录越多,再装填记录时,发生冲突的可能性就越大,则查找时,给定值需与之进行比较的关键字的个数也越多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/615526.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; func removeNthFromEnd(head *ListNode, n int) *ListNode {dummy : &ListNode{0, head}first, second : head, dummyfor i : 0; i < n; i {first first.Next}for ; first ! nil; first first.Next {second second.Next}second.N…

同态滤波的Python源码

同态滤波前 &#xff08;左&#xff09; 同态滤波后&#xff08;右&#xff09; 源码见下面链接&#xff1a; https://download.csdn.net/download/qqqweiweiqq/89129996?spm1001.2014.3001.5501

Leetcode算法训练日记 | day25

一、组合总和Ⅲ 1.题目 Leetcode&#xff1a;第 216 题 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺…

HDFS [MSST‘10] 论文阅读笔记

原论文&#xff1a;The Hadoop Distributed File System (MSST’10) HDFS关键技术要点概览 设计目标&#xff1a;HDFS旨在可靠地存储大型数据集&#xff0c;并以高带宽流式传输这些数据集到用户应用程序。它通过在大量服务器上分布存储和计算资源&#xff0c;使得资源可以随着…

A Learning-Based Approach for IP Geolocation(2010年)

下载地址:Towards IP geolocation using delay and topology measurements | Proceedings of the 6th ACM SIGCOMM conference on Internet measurement 被引次数:185 Eriksson B, Barford P, Sommers J, et al. A learning-based approach for IP geolocation[C]//Passive …

WebService反向代理的配置和

WebService反向代理的配置和 家都知道&#xff0c;联网上有很多被墙了的网站&#xff0c;虽然这是让人很伤心的一件事情&#xff0c;但还好咱们有办法绕过这个限制&#xff0c;那就是使用IP代理。今天我就来给大家讲讲如何配置和使用WebService反向代理。 什么是WebService反向…

二叉树遍历算法和应用

二叉树是指度为 2 的树。它是一种最简单却又最重要的树&#xff0c;在计算机领域中有这广泛的应用。 二叉树的递归定义如下&#xff1a;二叉树是一棵空树&#xff0c;或者一棵由一个根节点和两棵互不相交的分别称为根节点的左子树和右子树所组成的非空树&#xff0c;左子树和右…

DC-3渗透测试复现

DC-3渗透测试复现 目的&#xff1a; 获取最高权限以及5个flag 过程&#xff1a; 信息打点-sql注入-反弹shell- pkexec提权&#xff08;CVE-2021-4034&#xff09; 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.136) 靶机&#xff1a;DC_3(192.168.85.133) 复现…

SpringBoot中使用Jackson序列化返回

SpringBoot中使用Jackson序列化返回 在Spring Boot应用中&#xff0c;使用Jackson库来处理JSON的序列化和反序列化是一种常见的做法。Jackson是一个高效的JSON处理器&#xff0c;广泛用于Java环境中&#xff0c;尤其是在与Spring框架集成时。本文将详细介绍如何在Spring Boot中…

MATLAB数据类型和运算符+矩阵创建

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍一、MATLAB数据类型和运算符&#x1f48e;1 MATLAB的数据类型&#x1f339;…

LeetCode 24. 两两交换链表中的节点

解题思路 这道题用画图的方法是比较好的。 相关代码 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.…

C语言输出不同颜色的字体

本文章在Linux进行演示&#xff01;&#xff01;&#xff01; 使用C语言输出不同颜色字体和背景 格式&#xff1a; printf("\033[字体背景颜色;字体颜色m字符串\033[0m"); 上边的 \033 也可以用 \e 来代替。 字体颜色与字符的对应关系 字符颜色30黑色31红…