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

news2024/10/6 20:39:31

在这里插入图片描述

哈希表的基本概念

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

哈希函数的作用

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

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

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

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

哈希冲突的处理方法

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

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

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

任务

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

示例代码 - 使用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;
}

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

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

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

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

相关文章

Python常用功能的标准代码

后台运行并保存log 1 2 3 4 5 6 7 8 9 nohup python -u test.py > test.log 2>&1 & #最后的&表示后台运行 #2 输出错误信息到提示符窗口 #1 表示输出信息到提示符窗口, 1前面的&注意添加, 否则还会创建一个名为1的文件 #最后会把日志文件输出到test.log文…

卷积神经网络-池化层和激活层

2.池化层 根据特征图上的局部统计信息进行下采样&#xff0c;在保留有用信息的同时减少特征图的大小。和卷积层不同的是&#xff0c;池化层不包含需要学习的参数。最大池化(max-pooling)在一个局部区域选最大值作为输出&#xff0c;而平均池化(average pooling)计算一个局部区…

卷积神经网络-卷积层

卷积神经网络 卷积神经网络&#xff08;convolutional neural network&#xff0c;CNN&#xff09;是一类包含卷积计算且具有深度结构的前馈神经网络&#xff0c;是深度学习的代表算法之一。卷积神经网络具有表征学习能力&#xff0c;能够按其阶层结构对输入信息进行平移不变分…

H5移动端购物商城系统源码 小型商城全新简洁风格全新UI 支持易支付接口

一款比较简单的 H5 移动端购物商城系统源码&#xff0c;比较适合单品商城、小型商城使用。带有易支付接口。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88391704 源码下载2&#xff1a;评论留言或私信留言

【Spring笔记03】Spring依赖注入各种数据类型

这篇文章&#xff0c;详细介绍一下Spring框架中如何注入各种数据类型&#xff0c;包含&#xff1a;注入基本数据类型、数组、集合、Map映射、Property属性、注入空字符串、注入null值、注入特殊字符等内容&#xff0c;以及如何使用命名空间进行依赖注入。 目录 一、注入各种数据…

云原生Kubernetes:简化K8S应用部署工具Helm

目录 一、理论 1.HELM 2.部署HELM2 3.部署HELM3 二、实验 1.部署 HELM2 2.部署HELM3 三、问题 1.api版本过期 2.helm初始化报错 3.pod状态为ImagePullBackOff 4.helm 命令显示 no repositories to show 的错误 5.Helm安装报错 6.git命令报错 7.CentOS 7 下git c…

互联网Java工程师面试题·Elasticsearch 篇·第一弹

目录 1、elasticsearch 了解多少&#xff0c;说说你们公司 es 的集群架构&#xff0c;索引数据大小&#xff0c;分片有多少&#xff0c;以及一些调优手段 。 1.1 设计阶段调优 1.2 写入调优 1.3 查询调优 1.4 其他调优 2、elasticsearch 的倒排索引是什么 3、elastic…

ToDoList使用自定义事件传值

MyTop与MyFooter与App之间传递数据涉及到的就是子给父传递数据&#xff0c;MyList和MyItem与App涉及到爷孙传递数据。 之前的MyTop是使用props接收App传值&#xff0c;然后再在methods里面调用&#xff0c;现在使用自定义事件来处理子组件和父组件之间传递数据。 图是之前的…

新款UI动态壁纸头像潮图小程序源码

新款UI动态壁纸头像潮图小程序源码&#xff0c;不需要域名服务器&#xff0c;直接添加合法域名&#xff0c;上传发布就能使用。 可以对接开通流量主&#xff0c;个人也能运营&#xff0c;不需要服务器源码完整。整合头像&#xff0c;动态壁纸&#xff0c;文案功能齐全。 源码…

代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

本文思路和详细讲解来自于:代码随想录 (programmercarl.com) LeetCode T102 二叉树的层序遍历 题目链接:102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建…

芯驰D9评测(3)--建立开发环境

1. 建立交叉编译链接环境 官网下载的SDK包中就有交叉工具链&#xff0c;米尔提供的这个 SDK 中除了包含各种源代码外还提供了必要的交叉工具链&#xff0c;可以直接用于编译应用程序等。 用户可以直接使用次交叉编译工具链来建立一个独立的开发环境&#xff0c;可单独编译…

发光文字跟随鼠标

效果展示 CSS / JavaScript 知识点 background-image 绘制网格背景filter 属性的运用onmousemove 事件运用getBoundingClientRect 方法的运用 实现页面基础结构 <!-- 光标 --> <div class"cursour"></div>实现网格背景样式 body {min-height: …

如何用 Tana AI 一站式批量润色整理音频笔记?

&#xff08;注&#xff1a;本文为小报童精选文章&#xff0c;已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 用好 Tana AI Builder &#xff0c;充分体验和发挥 AI 工作流的强大性能。 痛点 作为一个足够懒惰的写作者&#xff0c;我对音频转文本这事儿…

智慧公厕如何实现?

随着城市化进程的加速&#xff0c;人们对公共设施的需求也日益增长。而公厕&#xff0c;作为城市基础设施的一部分&#xff0c;扮演着重要的角色。然而&#xff0c;传统的公厕存在着诸多问题&#xff0c;例如管理不善、环境脏乱等&#xff0c;给人们的生活带来了不便。为了改善…

笔试强训Day13

T1&#xff1a;跳石板 [小易来到了一条石板路前&#xff0c;每块石板上从1挨着编号为&#xff1a;1、2、3....... 这条石板路要根据特殊的规则才能前进&#xff1a;对于小易当前所在的编号为K的 石板&#xff0c;小易单次只能往前跳K的一个约数(不含1和K)步&#xff0c;即跳…

【LeetCode刷题笔记】双指针

剑指 Offer 21.调整数组顺序使奇数位于偶数前面 解题思路&#xff1a; 对撞指针 &#xff0c; 从左边不停的找第一个偶数&#xff0c;从右边不停的找第一个奇数 &#xff0c;找到后 交换 两者位置 本题与【905. 按奇偶排序数组】几乎雷同。 剑指 Offer 57.和为s的两个数字 本题…

SpringCloud-消息组件

1 简介 了解过RabbitMQ后&#xff0c;可能我们会遇到不同的系统在用不同的队列。比如系统A用的Kafka&#xff0c;系统B用的RabbitMQ&#xff0c;但是没了解过Kafka&#xff0c;因此可以使用Spring Stream&#xff0c;它能够屏蔽地产&#xff0c;像JDBC一样&#xff0c;只关心SQ…

超聚变安装银河麒麟服务器系统ky10-server-x86

超聚变-通过BMC口进服务器管理界面 如下图为BMC管理口&#xff1a; 默认BMC口IP&#xff1a;https://192.168.2.100 l浏览器打开网页&#xff0c;输入用户名和密码 登陆后&#xff0c;如下图红框处&#xff0c;选择“启动虚拟控制台”——选择“HTML集成远程控制台” 系统银河麒…

绘画的颜料

Alcohol Ink 酒精油墨 酒精墨水风格是一种绘画技术&#xff0c;使用酒精为基础的墨水创造出充满活力和丰富多彩的设计。 墨水是半透明的&#xff0c;可以分层以达到深度和复杂性。 Alcohol ink painting of a husky, side viewAcrylic 丙烯颜料 色彩鲜艳的多功能涂料。它可以…

基于Java的蛋糕甜品系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&…