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

news2024/10/3 8:29:02

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

在这里插入图片描述

目录

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

概念

散列表(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

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

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

相关文章

CogAgent:带 Agent 能力的视觉模型来了

之前我们分享过智谱AI新一代多模态大模型 CogVLM&#xff0c;该模型在不牺牲任何 NLP 任务性能的情况下&#xff0c;实现视觉语言特征的深度融合&#xff0c;其中 CogVLM-17B 在 14 个多模态数据集上取得最好或者第二名的成绩。 12月15日&#xff0c;基于 CogVLM&#xff0c;提…

【小沐学写作】Docsify制作在线电子书、技术文档(Docsify + Markdown + node)

文章目录 1、简介2、安装2.1 node2.2 docsify-cli 3、配置3.1 初始化3.2 预览效果3.3 加载对话框3.4 更多页面3.5 侧 栏3.6 自定义导航栏 结语 1、简介 https://docsify.js.org/#/?iddocsify 一个神奇的文档网站生成器。 简单轻巧没有静态构建的 html 文件多个主题 Docsify…

第11章 GUI Page426~427 步骤七 设置直线前景色

运行效果&#xff1a; 关键代码&#xff1a; 接口类 IItem中新增29,30行两个设置前景色纯虚方法 //item_i.hpp 抽象“图形元素”接口定义 #ifndef ITEM_I_HPP_INCLUDED #define ITEM_I_HPP_INCLUDED#include <wx/gdicmn.h> #include <wx/dc.h>class IItem { publ…

Matlab论文插图绘制模板第132期—函数等高线填充图

在之前的文章中&#xff0c;分享了Matlab函数折线图的绘制模板&#xff1a; 函数三维折线图&#xff1a; 函数网格曲面图&#xff1a; 函数曲面图&#xff1a; 函数等高线图&#xff1a; 进一步&#xff0c;再来分享一下函数等高线填充图。 先来看一下成品效果&#xff1a; 特…

HP笔记本电脑进入BIOS的方法主要有两种,它们使用场合不同

BIOS&#xff08;基本输入输出系统&#xff09;是一种实用程序&#xff0c;它在你按下电源按钮后启动并加载操作系统。无论是要更新HP笔记本电脑的BIOS系统&#xff0c;还是清除前一个系统中的错误&#xff0c;第一步都是进入BIOS实用程序。 在按键输入BIOS设置并对其进行修改…

Hadoop入门学习笔记——三、使用HDFS文件系统

视频课程地址&#xff1a;https://www.bilibili.com/video/BV1WY4y197g7 课程资料链接&#xff1a;https://pan.baidu.com/s/15KpnWeKpvExpKmOC8xjmtQ?pwd5ay8 Hadoop入门学习笔记&#xff08;汇总&#xff09; 目录 三、使用HDFS文件系统3.1. 使用命令操作HDFS文件系统3.1.…

【5G PHY】NR参考信号功率和小区总传输功率的计算

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

Vue3 性能优化

代码分析 由于我们使用的是vite vite打包是基于rollup 的我们可以使用 rollup 的插件 npm install rollup-plugin-visualizervite.config.ts 配置 记得设置open 不然无效 import { visualizer } from rollup-plugin-visualizer; plugins: [vue(), vueJsx(),visualizer({open:…

【Java探索之旅】我与Java的初相识(完):注释,标识符,关键字

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java入门到精通 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. Java的注释方式二. 标识符三. 关键字四. 全篇总结 &#x1f4d1;前言 在Java编程…

1856_emacs_calc使用介绍与故事

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/g_org: my learning trip for org-mode 1856_emacs_calc使用介绍与故事 calc是emacs内置的一个计算器&#xff0c;可以提供多种计算表达方式并且可以支持org-mode中的表格功能。 主题由来介绍 我是因为想要了解org-…

nodejs微信小程序+python+PHP医疗机构药品及耗材信息管理系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

3 个适用于 Mac 电脑操作的 Android 数据恢复最佳工具 [附步骤]

在当今的数字时代&#xff0c;无论是由于意外删除、系统故障还是其他原因&#xff0c;从 Android 设备中丢失数据不仅会带来不便&#xff0c;而且会造成非常严重的后果。特别是对于Mac用户来说&#xff0c;从Android手机恢复数据是一个很大的麻烦。幸运的是&#xff0c;随着许多…

如何利用PPT绘图并导出清晰图片

在写论文的过程中&#xff0c;免不了需要绘图&#xff0c;但是visio等软件绘图没有在ppt上绘图比较熟练&#xff0c;尤其流程图结构图. 但是ppt导出的图片也不够清晰&#xff0c;默认分辨率是96dpi&#xff0c;而杂志投稿一般要求至300dpi。解决办法如下&#xff1a; 1.打开注…

一款超好看流行的HTML随机视频播放背景引导页面源码

前言 今天宋佳乐博客给大家带来一款2024新版视频背景网址导航引导页面源码带背景动态HTML源码 源码介绍 2024新版视频背景网址导航引导页面源码带背景动态HTML源码&#xff0c;非常的炫酷&#xff0c;有需要的自行去体验吧&#xff0c;还是非常不错的 演示地址&#xff1a;点…

【随想】每日两题Day.22

题目&#xff1a;102. 二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[…

Unity PlayerPrefs存储数据在Windows环境中本地存储的位置

Unity PlayerPrefs存储数据在Windows环境中本地存储的位置 一、编辑器模式下的PlayerPrefs存储位置1.Win r 输入regedit进入注册表界面2. HKEY_CURRENT_USER/Software/Unity3.CompanyName和ProjectName可以在Unity->Edit->Project Settings->Player中查看和设置 二、…

Leetcode算法系列| 4. 寻找两个正序数组的中位数

目录 1.题目2.题解C# 解法一&#xff1a;合并List根据长度找中位数C# 解法二&#xff1a;归并排序后根据长度找中位数C# 解法三&#xff1a;方法二的优化&#xff0c;不真实添加到listC# 解法四&#xff1a;第k小数C# 解法五&#xff1a;从中位数的概念定义入手 1.题目 给定两个…

大模型工具_QUIVR

https://github.com/StanGirard/quivr/ 24.5K Star 1 功能 整体功能&#xff0c;想解决什么问题 实现了前后端结合的 RAG 方案。构建能直接使用的应用。提出了“第二大脑”&#xff0c;具体实现也是RAG&#xff0c;但针对不同用户不同场景支持多个“大脑”并存&#xff0c;每个…

C语言用两个函数求最大公约数和最小公倍数

目录 1【c语言】(函数)写两个函数,分别求两个整数的最大公约数和最小公倍数。在主函数中输入两个数&#xff0c;分别调用这两个函数&#xff0c;并输出结果 2代码: 3运行代码: 4总结: 1【c语言】(函数)写两个函数,分别求两个整数的最大公约数和最小公倍数。在主函数中输入两…

智能优化算法应用:基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于金枪鱼群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.金枪鱼群算法4.实验参数设定5.算法结果6.…