当前位置: 首页 > news >正文

十天学完基础数据结构-第八天(哈希表(Hash Table))

在这里插入图片描述

哈希表的基本概念

哈希表是一种数据结构,用于存储键值对。它的核心思想是将键通过哈希函数转化为索引,然后将值存储在该索引位置的数据结构中。

哈希函数的作用

哈希函数是哈希表的关键部分。它将输入(键)映射到哈希表的索引位置。一个好的哈希函数应该具有以下特点:

  • 快速计算:哈希函数应该能够快速计算出索引,以保持高效性能。

  • 均匀分布:哈希函数应该尽可能均匀地将键分布在哈希表中,以减少哈希冲突的发生。

  • 低冲突率:好的哈希函数应该最小化冲突的发生,即不同的键映射到同一个索引的情况。

哈希冲突的处理方法

哈希冲突是不同的键映射到相同索引的情况。解决哈希冲突的常见方法包括:

  • 开放寻址法:如果发生冲突,就顺序查找下一个可用的位置,直到找到空槽或达到最大探测次数。

  • 链地址法:每个哈希表索引位置都存储一个链表或其他数据结构,以存储多个键值对,具有相同哈希值的键值对将链接在一起。

任务

使用哈希表来解决查找和存储问题。哈希表是许多现实世界应用的基础,包括数据库索引、缓存系统和编程语言中的字典。

示例代码 - 使用C++创建简单的哈希表:

#include <iostream>
#include <vector>
#include <list>class HashTable {
public:HashTable(int size) : size(size), table(size) {}// 哈希函数:将键映射到索引int hash(const std::string& key) {int hashValue = 0;for (char ch : key) {hashValue += ch;}return hashValue % size;}// 插入键值对void insert(const std::string& key, int value) {int index = hash(key);table[index].push_back(std::make_pair(key, value));}// 查找键对应的值int get(const std::string& key) {int index = hash(key);for (const auto& pair : table[index]) {if (pair.first == key) {return pair.second;}}return -1; // 未找到}private:int size;std::vector<std::list<std::pair<std::string, int>>> table;
};int main() {HashTable ht(100); // 创建一个大小为100的哈希表// 插入键值对ht.insert("Alice", 25);ht.insert("Bob", 30);ht.insert("Charlie", 22);// 查找键对应的值std::cout << "Alice的年龄是:" << ht.get("Alice") << " 岁" << std::endl;return 0;
}

运行结果:在这里插入图片描述

练习题

  1. 解释哈希表的基本概念中的键、值、哈希函数和索引。

  2. 为什么哈希函数的均匀分布很重要?

  3. 描述哈希冲突以及解决哈希冲突的两种常见方法。

  4. 你可以设计一个简单的哈希表,用于存储学生的姓名和成绩。使用C++创建这个哈希表,并实现插入和查找功能。

解释哈希表的基本概念中的键、值、哈希函数和索引。

  • 键(Key):键是哈希表中用于查找和访问数据的唯一标识符。它类似于字典中的词条,用于获取相应的值。在学生姓名和成绩的哈希表中,姓名可以是键。

  • 值(Value):值是与键相关联的数据。在学生姓名和成绩的哈希表中,成绩可以是值。

  • 哈希函数(Hash Function):哈希函数是一种将键映射到哈希表索引的算法。它接受键作为输入,并生成一个整数索引,用于在哈希表中存储或查找值。

  • 索引(Index):索引是哈希表中的位置或槽,用于存储键值对。哈希函数计算的结果确定了键值对在哈希表中的存储位置。

为什么哈希函数的均匀分布很重要?

哈希函数的均匀分布非常重要,因为它直接影响了哈希表的性能。如果哈希函数不均匀,导致大量的键映射到相同的索引位置,会导致哈希冲突增加,使得哈希表性能下降。均匀分布意味着不同的键能够均匀地分散到不同的索引位置,减少冲突的概率,从而保持了哈希表的高效性能。

描述哈希冲突以及解决哈希冲突的两种常见方法。

  • 哈希冲突(Hash Collision):哈希冲突是指两个不同的键通过哈希函数映射到相同的索引位置。这可能会导致数据丢失或覆盖,降低哈希表的性能。

  • 解决哈希冲突的两种常见方法

    • 开放寻址法(Open Addressing):在发生冲突时,继续寻找下一个可用的索引位置,直到找到一个空槽或达到最大探测次数。常见的开放寻址方法包括线性探测和二次探测。

    • 链地址法(Chaining):每个索引位置上都维护一个链表或其他数据结构,用于存储多个键值对。当发生冲突时,新的键值对被添加到链表中。这是解决冲突最常见的方法之一。

你可以设计一个简单的哈希表,用于存储学生的姓名和成绩。使用C++创建这个哈希表,并实现插入和查找功能。

当设计哈希表时,需要考虑哈希函数的设计,解决冲突的方法,以及合适的数据结构来存储每个索引位置上的键值对。下面是一个简单示例:

#include <iostream>
#include <vector>
#include <list>class HashTable {
public:HashTable(int size) : size(size), table(size) {}// 哈希函数int hash(const std::string& key) {int hashValue = 0;for (char ch : key) {hashValue += ch;}return hashValue % size;}// 插入键值对void insert(const std::string& key, int value) {int index = hash(key);table[index].push_back(std::make_pair(key, value));}// 查找键对应的值int get(const std::string& key) {int index = hash(key);for (const auto& pair : table[index]) {if (pair.first == key) {return pair.second;}}return -1; // 未找到}private:int size;std::vector<std::list<std::pair<std::string, int>>> table;
};int main() {HashTable ht(100); // 创建一个大小为100的哈希表// 插入键值对ht.insert("Alice", 85);ht.insert("Bob", 92);ht.insert("Charlie", 78);// 查找键对应的值std::cout << "Alice的成绩是:" << ht.get("Alice") << std::endl;return 0;
}

运行结果:在这里插入图片描述

注意:上述示例代码演示了如何创建一个简单的哈希表,用于存储学生的姓名和成绩。实际应用中,哈希表的设计可能更复杂,哈希函数的选择也要根据具体情况进行优化。

相关文章:

十天学完基础数据结构-第八天(哈希表(Hash Table))

哈希表的基本概念 哈希表是一种数据结构&#xff0c;用于存储键值对。它的核心思想是将键通过哈希函数转化为索引&#xff0c;然后将值存储在该索引位置的数据结构中。 哈希函数的作用 哈希函数是哈希表的关键部分。它将输入&#xff08;键&#xff09;映射到哈希表的索引位…...

flink集群部署

虚拟机配置 bigdata-hmaster 192.168.135.112 4核心 32GB bigdata-hnode1 192.168.135.113 4核心 16GB bigdata-hnode2 192.168.135.114 4核心 16GB 安装包&#xff1a;https://dlcdn.apache.org/flink/flink-1.17.1/flink-1.17.1-bin-scala_2.12.tgz 放到/usr/lcoal/lib目录…...

2.证明 非单一点 Oct.2023

目录 原题解引申出的编程问题非单一点题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题解题目正解 原题 已知等边 Δ P 0 P 1 P 2 \Delta P_0P_1P_2 ΔP0​P1​P2​&#xff0c;它的外接圆是 O O O&#xff0c;设 O O O的半径是 R R R。同时&#xff0c;设 Δ …...

常见的软件脱壳思路

单步跟踪法 1.本方法采用OD载入。 2.跟踪F8&#xff0c;实现向下的跳。 3.遇到程序回跳按F4。 4.绿色线条表示跳转没实现&#xff0c;不用理会&#xff0c;红色线条表示跳转已经实现&#xff01; 5.刚载入程序有一个CALL的&#xff0c;我们就F7跟进去&#xff0c;不然程序很容…...

Python:torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解

Python&#xff1a;torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解 1. 函数参数 在torch中的卷积操作有三个&#xff0c;torch.nn.Conv1d(),torch.nn.Conv2d()还有torch.nn.Conv3d(),这是搭建网络过程中常用的网络层&#xff0c;为了用好卷积层&#xff0…...

scala 连接 MySQL 数据库案例

1 依赖准备 mysql 8添加&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency> mysql 5 添加&#xff1a; <dependency><grou…...

guava工具类常用方法

Guava是Google开发的一个Java开源工具类库&#xff0c;它提供了许多实用的工具类和功能&#xff0c;可以简化Java编程中的常见任务。 引入依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>2…...

CSShas伪类选择器案例附注释

<!DOCTYPE html> <html lang="en"> <head><meta charset...

nodejs+vue中医体质的社区居民健康管理系统elementui

可以实现首页、中医体质量表、健康文章、健康视频、我的等&#xff0c;在我的页面可以对医生、小区单元、医疗药品等功能进行操作。目前主要的健康管理系统是以西医为主&#xff0c;而为了传扬中医文化&#xff0c;提高全民健康意识&#xff0c;解决人民日益增长的美好生活需要…...

Kotlin中reified 关键字

前言 在开始之前&#xff0c;让我们先讨论一下泛型。泛型用于为类、函数或接口提供通用的实现。下面是一个示例泛型方法&#xff1a; fun <T> displayValue(value: T) {println(value) }fun main() {displayValue<String>("Generics")displayValue<…...

Linux命令(95)之alias

linux命令之alias 1.alias介绍 linux命令alias是用来将/bin目录下的命令进行别名设置&#xff0c;将一些较长的命令进行简化。 alias命令的作用只局限于该次登入的操作&#xff0c;相当于临时变量。 如果对当前用户永久生效&#xff0c;需修改~/.bashrc文件&#xff0c;使用…...

DHCPsnooping 配置实验(2)

DHCP报文泛洪攻击 限制接收到报文的速率 vlan 视图或者接口视图 dhcp request/ dhcp-rate dhcp snooping check dhcp-request enable dhcp snooping alarm dhcp-request enable dhcp snooping alarm dhcp-request threshold 1 超过则丢弃报文 查看[Huawei]dis dhcp statistic…...

Qt 综合练习小项目--反金币(2/2)

目录 4 选择关卡场景 4.2 背景设置 4.3 创建返回按钮 4.3 返回按钮 4.4 创建选择关卡按钮 4.5 创建翻金币场景 5 翻金币场景 5.1 场景基本设置 5.2 背景设置 5.3 返回按钮 5.4 显示当前关卡 5.5 创建金币背景图片 5.6 创建金币类 5.6.1 创建金币类 MyCoin 5.6.…...

安装matplotlib__pygame,以pycharm调入模块

安装pip 安装matplotlib 安装完毕&#xff0c;终端输入pip list检查 导入模块出现bug&#xff0c;发现不是matplotlib包的问题&#xff0c;pycharm版本貌似不兼容&#xff0c;用python编辑器可正常绘图&#xff0c;pygame也可正常导入。 ​​​​​​​ pycharm版本问题解决 终…...

编写可扩展的软件:架构和设计原则

在今天的软件开发领域&#xff0c;可扩展性是一个至关重要的概念。无论您是开发一个小型应用程序还是一个大规模的软件系统&#xff0c;都需要考虑如何使您的软件能够在不断变化的需求下进行扩展和演进。本文将探讨编写可扩展软件的关键架构和设计原则&#xff0c;以帮助开发人…...

算法-排序算法

0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。 非比较类排序&#xff1a;不通过比较来决定元素间…...

Android_Monkey_测试执行策略及标准

一、Monkey命令概述 NO命令说明用法解释1 -p ALLOWED_PACKAGE用于指定某个apk&#xff0c;可以使用多个-p选项&#xff0c;但是每个-p命令选项只能用于一个apk 如果不指定-p&#xff0c;Monkey就会默认进行全系统测试。 -p com.android.contacts可以进行特定apk的Monkey测试2 …...

windows安装nginx

官网提供的下载地址&#xff1a;nginx: download nginx1.25.2下载地址&#xff1a;http://nginx.org/download/nginx-1.25.2.zip 直接运行nginx.exe会闪退&#xff0c;我们还得使用cmd/git bash/power shell 命令进行启动&#xff1b; 个人更喜欢git bash&#xff1b; 运行命…...

Java日期的学习篇

关于日期的学习 目录 关于日期的学习JDK8以前的APIDate Date常用APIDate的API应用 SimpleDateFormatSimpleDateFormat常用API测试 反向格式化(逆操作)测试 训练案例需求(秒杀活动)实现 Calendar需求痛点常见API应用测试 JDK8及以后的API(修改与新增)为啥学习(推荐使用)新增的AP…...

spark on hive

需要提前搭建好hive&#xff0c;并对hive进行配置。 1、将hive的配置文件添加到spark的目录下 cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf2、开启hive的hivemetastore服务 提前创建好启动日志存放路径 mkdir $HIVE_HOME/logStart nohup /usr/local/lib/apache-hi…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...