【数据结构入门精讲 | 第十四篇】散列表知识点及考研408、企业面试练习(1)

在上一篇中我们进行了树的专项练习,在这一篇中我们将进行散列表知识点的学习。

在这里插入图片描述

目录

    • 概念
    • 伪代码
    • 线性探测法
    • 平方探测法
    • 查找成功的平均查找长度
    • 查找失败的平均查找长度
    • 判断题
    • 选择题

概念

散列表(Hash Table),也被称为哈希表或散列映射,是一种常用的数据结构之一。它通过将键(key)映射到值(value)来实现高效的数据存储和检索。

散列表的主要思想是利用哈希函数将键转换成对应的索引,然后将值存储在该索引位置上。当需要查找或插入元素时,再次使用哈希函数计算出对应的索引,从而快速定位到目标位置。

散列表的优势在于具有高效的查找和插入操作。由于直接通过索引进行访问,时间复杂度通常为O(1),即常数时间。

装填因子: 设m和n分别表示表长和表中填入的结点数,则将α=n/m定义为散列表的装填因子(Load Factor)。α越大,表越满,冲突的机会也越大。通常取α≤1。

然而,在极端情况下,散列表的性能可能会下降,例如哈希冲突(多个键映射到同一个索引位置)的发生,这会导致链表的长度增加,进而影响到操作的效率。为了解决这个问题,可以采用一些方法,本文介绍两种方法。

伪代码

// 定义散列表的数据结构
struct HashTable {
    int size; // 散列表的大小
    vector<vector<pair<Key, Value>>> table; // 存储键值对的二维向量数组
};

// 初始化散列表
HashTable Initialize(int size) {
    HashTable hashTable;
    hashTable.size = size;
    hashTable.table.resize(size); // 根据指定的大小调整table的大小
    return hashTable;
}

// 哈希函数,将键映射到散列表的索引位置
int HashFunction(Key key, int size) {
    // 根据键的特性,选择适当的哈希函数来计算散列值
    // 返回散列值对散列表大小取模,得到索引位置
    return hashValue % size;
}

// 向散列表中插入键值对
void Insert(HashTable& hashTable, Key key, Value value) {
    int index = HashFunction(key, hashTable.size); // 计算键的散列值并得到索引位置
    hashTable.table[index].push_back(make_pair(key, value)); // 在索引位置插入键值对
}

// 从散列表中删除指定键的键值对
void Delete(HashTable& hashTable, Key key) {
    int index = HashFunction(key, hashTable.size); // 计算键的散列值并得到索引位置
    vector<pair<Key, Value>>& bucket = hashTable.table[index]; // 获取索引位置的桶
    for (auto it = bucket.begin(); it != bucket.end(); ++it) {
        if (it->first == key) {
            bucket.erase(it); // 删除键值对
            break;
        }
    }
}

// 在散列表中查找指定键的值
Value Search(HashTable& hashTable, Key key) {
    int index = HashFunction(key, hashTable.size); // 计算键的散列值并得到索引位置
    vector<pair<Key, Value>>& bucket = hashTable.table[index]; // 获取索引位置的桶
    for (const auto& entry : bucket) {
        if (entry.first == key) {
            return entry.second; // 返回找到的值
        }
    }
    return defaultValue; // 如果未找到,则返回默认值
}

线性探测法

线性探测法(Linear Probing)是一种解决散列表中哈希冲突的开放寻址法。当哈希函数将键映射到一个已经被占用的位置时,线性探测法会依次往后查找下一个空闲位置,直到找到一个可用的位置为止。

具体来说,当进行插入或查找操作时,如果键在哈希表中的位置已经被占用,线性探测法会通过逐个检查相邻位置的方式,找到下一个可用的位置。如果下一个位置也被占用,则继续往后查找,直到找到一个空闲位置或者遍历整个散列表。

线性探测法的优势在于实现简单,不需要维护额外的数据结构。它可以将冲突的元素存储在散列表中的连续位置,减少了对内存的访问时间,有利于缓存性能的提升。此外,线性探测法还具有较好的空间利用率,因为所有元素都存储在同一个散列表中。

在这里插入图片描述

平方探测法

平方探测法(Quadratic Probing)是解决散列表中哈希冲突的一种开放寻址法。与线性探测法不同,平方探测法在查找下一个可用位置时使用了平方的增量来避免元素聚集在一起的问题。

具体来说,当进行插入或查找操作时,如果哈希函数将键映射到一个已经被占用的位置,平方探测法会通过使用平方的增量来寻找下一个可用位置。例如,在第一次冲突时,会尝试移动12=1个位置,如果仍然冲突,则尝试移动22=4个位置,依次类推。这样可以有效地避免连续的冲突,减少了元素聚集在一起的情况,提高了性能。

平方探测法的优势在于相对于线性探测法,它能够更均匀地分布元素,减少了聚集性,提高了散列表的性能。此外,平方探测法也无需维护额外的数据结构,实现较为简单。

查找成功的平均查找长度

比如给定
    22  43  15
0   1   2   3   4   5   6   7(表长为7)
求查找成功的平均查找长度?

当查找22时,查找长度为1
查找43时,查找长度为2
15时,为3
所以查找成功的平均查找长度为(1+2+3)/元素个数=6/3=2

查找失败的平均查找长度

比如给定
98  22 30  87   11  40  6   20(冲突)
0   1   2   3   4   5   6   7  8  9  10
求查找失败的平均查找长度?

接着假设给一个元素x
x只能从0映射到6(因为编号7是迫不得已才有位置的)
所以分母是7
当x映射到0时查找失败,则查找9次(查找编号0~7+查找为空)
当x映射到1时查找失败,则查找8次(查找编号1~7+查找为空)
当x映射到2时查找失败,则查找7次(查找编号2~7+查找为空)
...
当x映射到6时查找失败,则查找3次(查找编号6~7+查找为空)
所以分子是(9+8+7+...+3)=42

所以查找失败的平均查找长度为42/7

接下来我们开始散列表的专项练习

判断题

1.平均查找长度与节点个数无关的查找方法是:哈希(散列表)法(对)

2.在散列表中,所谓同义词就是:具有相同散列地址的两个元素(对)

3.将M个元素存入用长度为S的数组表示的散列表,则该表的装填因子为M/S。(对)

4.即使把2个元素散列到有100个单元的表中,仍然有可能发生冲突。(对)

5.在这里插入图片描述

6.在这里插入图片描述

7.在这里插入图片描述

解析:
表格为 0 1 2 3 4 5 6 7 8 9
先插入2,2%11=2,所以插入到编号2的位置
0 1 2 3 4 5 6 7 8 9
2
再插入2,理应插到编号2的位置,但2被占,(2+1^2)%11=3,所以插入到编号为3的位置
0 1 2 3 4 5 6 7 8 9
2 2
再插入2,理应插到编号2的位置,但2被占,(2+12)%11=3,所以插入到编号为3的位置,但3被占,(2+22)%11=6,所以插到编号为6的位置
再插入2,理应插到编号2的位置,但2被占,(2+12)%11=3,所以插入到编号为3的位置,但3被占,(2+22)%11=6,但6被占,(2+3^2)%11=0,所以插到编号为0的位置

8.在这里插入图片描述
9.在这里插入图片描述

10.在这里插入图片描述
解析:解析:如果是按取模10的话,会产生冲突。

选择题

在这里插入图片描述

解析:26%17=9
25%17=8
72%17=4
38%17=4,冲突,所以放在5
8%17=8,冲突,所以放9,但又冲突,所以放10
18%17=1
58%17=8,冲突,放11

2.在这里插入图片描述

3.在这里插入图片描述在第一次发现冲突之前插入的数字个数 除以 表长度 得到 装填因子

4.在这里插入图片描述

5.在这里插入图片描述

6.在这里插入图片描述

6%11=6
25%11=3
39%11=6 冲突 6+1^2=7
61%11=6 冲突 6-1^2=5

7.在这里插入图片描述
解析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.在这里插入图片描述

9.在这里插入图片描述
解析:

98  22 30  87   11  40  6   
0   1   2   3   4   5   6   7  8  9  10
插入20时,20本该占编号为6的位置,但被占,所以后移

98  22 30  87   11  40  6   20
0   1   2   3   4   5   6   7  8  9  10


接着假设给一个元素x
x只能从0映射到6(因为编号7是迫不得已才有位置的)
所以分母是7
当x映射到0时查找失败,则查找9次(查找编号0~7+查找的末尾为空)
当x映射到1时查找失败,则查找8次(查找编号1~7+查找的末尾为空)
当x映射到2时查找失败,则查找7次(查找编号2~7+查找的末尾为空)
...
当x映射到6时查找失败,则查找3次(查找编号6~7+查找的末尾为空)
所以分子是(9+8+7+...+3=42

所以查找失败的平均查找长度为42/7

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

向量投影:如何将一个向量投影到矩阵的行向量生成子空间?

向量投影&#xff1a;如何将一个向量投影到矩阵的行向量生成子空间&#xff1f; 前言 本问题是在学习Rosen梯度投影优化方法的时候遇到的问题&#xff0c;主要是对于正交投影矩阵(NT(NNT)-1N)的不理解&#xff0c;因此经过查阅资料&#xff0c;学习了关于向量投影的知识&…

嵌入式硬件电路原理图之跟随电路

描述 电压跟随电路 电压跟随器是共集电极电路&#xff0c;信号从基极输入&#xff0c;射极输出&#xff0c;故又称射极输出器。基极电压与集电极电压相位相同&#xff0c;即输入电压与输出电压同相。这一电路的主要特点是&#xff1a;高输入电阻、低输出电阻、电压增益近似…

Ubuntu:VS Code上C++的环境配置

使用 VSCode 开发 C/C 程序 , 涉及到 工作区的.vscode文件夹下的3个配置文件&#xff08;均可以手动创建&#xff09; : ① tasks.json : 编译器构建 配置文件 ; ② launch.json : 调试器设置 配置文件 ; ③ c_cpp_properties.json : 编译器路径和智能代码提示 配置文件 ;…

爬虫工作量由小到大的思维转变---<第二十三章 Scrapy开始很快,越来越慢(医病篇)>

诊断篇https://blog.csdn.net/m0_56758840/article/details/135170994?ops_request_misc%257B%2522request%255Fid%2522%253A%2522170333243316800180644102%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id1703332433168001806441…

JavaOOP篇----第十四篇

系列文章目录 文章目录 系列文章目录前言一、Hashcode的作用二、Java的四种引用,强弱软虚三、Java创建对象有几种方式?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码…

mac m1芯片 pytorch安装及gpu性能测试

pytorch 使用mac的m1芯片进行模型训练。 #小结&#xff1a;在数据量小和模型参数少&#xff0c;batch_size小时&#xff0c;cpu训练更快&#xff08;原因&#xff1a;每次训练时数据需要放入GPU中&#xff0c;由于batch_size小。数据放入gpu比模型计算时间还长&#xff09…

SpringIOC之AbstractMessageSource

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

K8S 外部访问配置、 Ingress、NodePort

将K8S部署应用提供给外部访问一般有三种方式&#xff1a; NodePort 暴露端口到节点&#xff0c;提供了集群外部访问的入口LoadBalancer 需要负载均衡器&#xff08;通常都需要云服务商提供&#xff0c;裸机可以安装 METALLB 测试&#xff09;Ingress 统一管理 svc的外部访…

Bloom过滤器

Bloom过滤器 一、概述二、原理三、优缺点1. 优点2.缺点 四、Bloom过滤器在比特币中的应用五、项目应用步骤1. pom.xml引入依赖2. 样例代码 六、Java版简易实现 一、概述 Bloom过滤器是一个允许用户描述特定的关键词组合而不必精确表述的基于概率的过滤方法。它能让用户在有效搜…

详解Vue3中的内置组件(transition)

本文主要介绍Vue3中的内置组件&#xff08;transition&#xff09;的普通写法和setup写法。 目录 一、在普通写法中使用内置组件&#xff08;transition&#xff09;二、在setup写法中使用内置组件&#xff08;transition&#xff09;三、使用注意项 在Vue3中&#xff0c;内置了…

Linux poll 和 select 机制

poll select 介绍 使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个 或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来 读或写.…

Nessus详细安装-windows (保姆级教程)

Nessus描述 Nessus 是一款广泛使用的网络漏洞扫描工具。它由 Tenable Network Security 公司开发&#xff0c;旨在帮助组织评估其计算机系统和网络的安全性。 Nessus 可以执行自动化的漏洞扫描&#xff0c;通过扫描目标系统、识别和评估可能存在的安全漏洞和弱点。它可以检测…

使用 Spring Boot + MyBatis开发需要注意的事项以及开发模版

前言&#xff1a; 注意&#xff0c;本篇不适用于有相关开发经验的开发者&#xff0c;作为一个在职开发者&#xff0c;我经常在完成从0-1的模块&#xff0c;也就是从数据库表开始到创建实体类&#xff0c;以及dao层&#xff0c;Service层等业务需要添加相关注解&#xff0c;这样…

使用office打开word文档时候提示错误:0x426-0x0的解决方案

在使用office打开word文档时候提示错误&#xff1a;0x426-0x0。如下图&#xff1a; 昨天还用的好好的&#xff0c;怎么今天就不行了&#xff1f;为什么呢&#xff1f; 更多工作中遇到问题见&#xff1a;凯哥BK 这个错误导致office无法启动通常是由于office软件所依赖的服务无…

vue的表单收集案例

Vue的表单收集案例 这只是最基础的表单收集&#xff0c;并未涉及到element-ui。 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>收集表单数据</title><script type"text/javascript" src"../js…

Hago 的 Spark on ACK 实践

作者&#xff1a;华相 Hago 于 2018 年 4 月上线&#xff0c;是欢聚集团旗下的一款多人互动社交明星产品。Hago 融合优质的匹配能力和多样化的垂类场景&#xff0c;提供互动游戏、多人语音、视频直播、 3D 虚拟形象互动等多种社交玩法&#xff0c;致力于为用户打造高效、多样、…

物理模拟重力 斜抛运动计算 抛物线计算

物理模拟重力 斜抛运动计算 抛物线计算 一、介绍二、原理三、实现如下PhysicsUtil.cs 工具类Missile.cs 四、资源分享 一、介绍 模拟Unity原始重力系统进行重写&#xff0c;可是实现发射到指定目标位置并能继续当前力进行自身的弹力与摩擦继续运动 二、原理 将Unity原始不受控…

word2003 open word2007+

Win 7 C:\Documents and Settings\Administrator\Application Data\Microsoft\Templates 还是不行&#xff0c;重装office2003吧&#xff0c;再安装转换插件&#xff0c;但是再高版本好像没转换工具

【Linux】进程管理

ps&#xff1a;报告当前进程快照。top&#xff1a;显示任务。kill&#xff1a;给一个进程发送信号。shutdown&#xff1a;关机或重启系统。 一个程序可以发动另一个程序被表述为一个父进程可以产生一个子进程&#xff0c;内核维护每个进程的信息&#xff0c;以此来保持事情有序…

【新版】软考 - 系统架构设计师(总结笔记)

个人总结学习笔记&#xff0c;仅供参考&#xff01;&#xff01;&#xff01;! →点击 笔者主页&#xff0c;欢迎关注哦&#xff08;互相学习&#xff0c;共同成长&#xff09; 笔记目录 &#x1f4e2;【系统架构设计系列】系统架构设计专业技能 计算机组成与结构操作系统信…