数据结构入门7-2(散列表)

news2025/1/13 13:19:26

        本笔记参考:《数据结构(C语言版)(第2版)》


散列表的基本概念

        像基于线性表、数表的查找方式,往往都是以关键字的比较为基础的。这种比较方式在遇到结点数量很多的情况时就会暴露其的弊端:需要大量匹配无效结点。为此,就提出了散列查找法(哈希)的思想:将元素的存储位置和其关键字之间建立某种直接关系,即需要一种关键字到地址的直接转换方法

散列表的术语:

术语解释
散列函数和散列地址

假设:

        p:记录的存储位置

        key:p中的关键字

若在p和key之间建立一个确定的关系H,使得

p = H(key)

则称H是散列函数,p是散列地址。

散列表

一个有限连续的地址空间,用来存储通过散列函数计算得到的相应散列地址的数据记录

(通常是个一维数组,散列地址是其下标

冲突和同义词

冲突:对于不同的关键字,可能得到同一个散列地址,这时就发生了冲突

同义词:具有相同函数值的关键字。

        事实上,在实际应用中,不产生冲突的散列函数极为少见。这是因为散列表中的关键字的取值集合往往远大于表空间的地址集。要将大量的关键字映射到有限的地址上,难免会产生冲突。通常,散列表的映射采取一对多的方式,而为了解决冲突,一般从两个方面入手:

  1. 设计一个“好”的散列函数(可以在一定程度上减少冲突)
  2. 发生冲突时,采取相应措施处理冲突。

散列函数的构造方式

构造散列表前,通常需要考虑以下因素:

  1. 散列表的长度;
  2. 关键字的长度;
  3. 关键字的分布情况;
  4. 计算散列函数所需的时间;
  5. 记录的查找频率。

构造散列函数的两条原则:

    1. 函数计算简单,每个关键字只对应一个散列地址;

    2. 函数的值域需要在表长的范围内,计算出的散列地址的分布应该均匀,尽量减少冲突。

构造散列函数的常见方法

1. 数字分析法

【适用范围】

  • 事先知道关键字集合;
  • 每个关键字的位数比散列表的地址码位数多。

【使用方法】

        设每个关键字由x位数组成,如k₁k₂...kₓ,则可以从关键字中提取出分布较为均匀的若位作为散列地址。

【例子】

假设:

  • 有80个记录,其关键字为8位十进制数
  • 散列表长度为100。

        则取关键字中的两位十进制数(两位对应100个地址)组成散列地址,下图所示是80个关键字中的一部分:

        对上述关键字全体进行分析:第①、②位分别只取“8”、“1”,第③位只取“3”或“4”,第⑧位取“2”、“5”或“7”,变化太少,无法反映位置信息。其余四位近乎随机,可将其化作散列地址(直接使用其中任意两位;或取其中两位后,与另外两位叠加、求和再舍去进位)。


2. 平方取中法

【适用范围】

        不能事先了解关键字的所有情况,或难以直接从关键字中找到取值较为分散的几位。

【使用方法】

        取关键字平方后的中间几位或其组合作为散列地址,使随机分布的关键字得到的散列地址也是随机的(具体的散列地址位数由表长决定)。


3. 折叠法

【适用范围】

  • 散列地址的位数较少,而关键字的位数较多;
  • 难以直接从关键字中找到取值比较分散的几位。

【使用方法】

  1. 将关键字分割为位数相同的几部分(最后一部分的位数可以不同)
  2. 取这几部分的叠加和(舍去进位)作为散列地址。

折叠方式也分为两种:

【例子】

 假设:

  • 散列表长度为1000;
  • 关键字key = 45387765213。

        将key从左到右每3位数进行一次分割,得到:453、877、652、13。对应的两种叠加方式如图所示:


4. 除留余数法

【适用范围】

        适用范围广,是最常用的构造散列函数的方法。

【使用方法】

        假设散列表长度为m,选取一个数p(p ≤ m),用p去除关键字,所得余数就是散列地址,即:

    一般情况下,p可选取小于m的最大质数。

处理冲突的方法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue3-实战-03-管理后台路由分析搭建和登录模块开发

1-路由的搭建 先分析模块,搭建一些基础的路由信息,我们分析需要登录页面路由,登录成功后展示数据路由,404页面路由,以及我们输入错误的路径的我们需要重定向到404路由。配置好相关路由之后,我们需要在入口文…

基于 ESP32-H2 构建高性价比的安全物联网设备

如今,人们对网联设备安全性的认识和关注不断增加。在欧盟《网络弹性法案》也即将生效的,为网联设备增加硬件层面的安全功能非常重要。 乐鑫 ESP32-H2 致力于为所有开发者提供高性价比的安全解决方案,这款芯片经过专门设计以集成多种安全功能…

【java】java访问https并验证账号密码

java访问https,获取页面或者数据时,需要证书和账号密码的验证。 一 获取CRT证书 获取网站的证书,拿到证书后可能是crt格式,可以使用下面的命令转为p12格式 openssl pkcs12 -export -in Mycert.crt -inkey Mykey.key -out Mycer…

0基础学习VR全景平台篇第35篇:场景功能-细节

本期为大家带来蛙色VR平台,场景管理—细节功能操作。 功能位置示意 一、本功能将用在哪里? 细节功能,用于展示VR漫游作、大像素、高清矩阵作品中细微不容易发现,但却又比较有亮点或者能起到关键作用的画面。 通过在全景图中添加…

javaWeb ssh课程资源网站myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh课程资源网站系统是一套完善的web设计系统(系统采用ssh框架进行设计开发),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

字节的测试面试题,你觉得很难吗?不是有手就行....

年前的时候,我的一个粉丝跟我说,他在面试美团的自动化测试岗的时候,不幸挂掉了。 越想越可惜,回想面试经过,好好总结了几个点,发现面试没过的主要原因是在几个关键的问题没有给到面试官想要的答案 字节的…

6-HEX, SE,引物荧光标记试剂,胺反应性琥珀酰亚胺酯,广泛用于nucleic acid测序和相关研究

6-HEX, SE | 6-HEX,SE [6-羧基-2,4,4,5,7,7-六氯荧光素,琥珀酰亚胺酯] |CAS:N/A | 纯度:95% (文章资料汇总来源于:陕西新研博美生物科技有限公司小编MISSwu)​ 结构…

Android Cannot resolve symbol 找不到资源解决方案

一、介绍 在android开发中,我们经常会发现依赖了系统提供的库,但是无法引用,或者找不到, Cannot resolve symbol style/Theme.AppCompat.NoActionBar ,报红。这些最经典的无法加载。 出现这个原因并不是你项目的原因&…

手把手教你如何正确永久使用Microsoft Office365?

office2019和office 365有什么区别的呢?为什么越来越多的人更加钟爱office365。简单来说office 2019的零售版本属于一次售出永久使用,价格上比较贵,而且功能上也不会再有更新。而office 365是一种基于云的订阅服务,我们花钱买的是…

Datax同步MySQL到ES

Datax同步MySQL到ES 1、在MySQL中建表2、在ES建立索引3、构建从MySQL到ES的Datax的Json任务4、运行mysql2es.json脚本以下是工作中做过的ETL,如有需要,可以私信沟通交流,互相学习,一起进步 1、在MySQL中建表 建表语句 CREATE TABL…

如何在Flutter 中启用空安全

目录 Step 1: 开启空安全设置 Step 2:检查可升级的三方库 Step 3:升级三方库 Step 4:代码适配支持空安全 Step 1: 开启空安全设置 Flutter 2默认启用了空安全,所以通过Flutter 2创建的项目是已经开启了空安全的检查的,不知道自己是什么版本的可以通…

【MCS-51单片机汇编语言】期末复习总结①——常见指令汇总(题型一)

文章目录 七大寻址方式重要指令转移堆栈加减乘除位操作跳转条件转移子程序常考题型 七大寻址方式 立即寻址:通过一个立即数来指定存储单元的地址,例如#41H;寄存器寻址:Rn(n0~7),A,B&#xff0c…

自学软件测试,一般人我劝你还是算了吧

软件测试自学是完全可以的,但是这句话并不代表人人都可以自学。 想转行软件测试,纯自学会遇到以下8个问题: 1、自学需要很高的自律性,你能做到吗? 2、自学在学习过程中会碰到很多困难,你都能解决吗&#xf…

直播入门手册

直播除了带货,现在越来越成了分享知识,增近主播和粉近距离互动的平台。最近看到抖音上越来越多的主播进行编程经验的分享,这是一个很好的传播知识的方式,以前我们学习编程技术一般看视频,其实视频的互动性没有直播那么…

智能家居数据分析:语音交互为用户偏好模式,使用最高达72%

哈喽大家好,近些年来,智能家居行业的发展无比迅速,同时,最近两年来人工智能技术的不断突破,对智能家居有着无与伦比的推动力。本期将为大家介绍下智能家居的行业形势。 通过数据可视化平台把报表数据处理后展示出来的…

(4)NUC980 RootFs

Buildroot是一个开源的嵌入式Linux系统构建工具,它可以帮助用户自动化构建Linux系统的各个部分,包括Linux内核、库、文件系统、应用程序等。通过Buildroot,用户可以根据需要选择和配置所需的软件包,从而构建一个定制化的Linux系统…

Nginx网站服务——编译安装及系统服务添加

Nginx网站服务——编译安装及系统服务添加 一、Nginx的相关知识1.Nginx的简介2. Apache与Nginx的区别3.Apache的优势4.Nginx的优势 二、Nginx编译安装1.关闭防火墙,将安装nginx所需软件包传到/opt目录下2.安装相关的依赖包3.创建运行用户、组4.编译安装Nginx5.检查、…

【Rust学习】web框架 Axum,提供REST API

cargo-watch:有修改就重启服务器,类似java web的热部署 安装:cargo install cargo-watch 使用:cargo watch -x run 这样每次有修改就会自动重启web服务 vscode插件Thunder Client(类似postman) hello,world 建议用cargo add的方式添加 […

视频压缩存储解决方案

一、背景介绍 随着视频技术的不断发展,人们对视频质量和存储需求的要求也越来越高。而视频文件的大小往往会给存储和传输带来诸多困扰。因此,如何有效地压缩视频文件成为了一个非常重要的问题。 二、压缩算法简介 有损压缩:通过去除视频中的…

SpringBoot3整合SpringSecurity,实现自定义接口权限过滤

接口权限过滤是指对于某些接口或功能,系统通过设定一定的权限规则,只允许经过身份认证且拥有相应权限的用户或应用程序进行访问和操作。这种技术可以有效地保护系统资源和数据安全,防止未授权的用户或程序进行恶意操作或非法访问。通常情况下…