C++的数据结构(十七):哈希表

        哈希表,又称散列表,是一种根据关键码值(Key value)直接访问的数据结构。通过把关键码值映射到表中的位置,可以快速找到对应的数据,从而大大提高查找效率。这种映射关系是通过散列函数来实现的,散列函数将关键码值转化为一个索引值,该索引值对应着表中的存储位置。

        哈希表通过哈希函数将键映射到数组的索引位置。理想情况下,哈希函数应该能够将不同的键均匀地映射到数组的各个位置,以减少冲突。当两个不同的键映射到同一个位置时,就需要采用冲突解决策略,如链地址法或开放定址法。

        在选择哈希表时,需要考虑多个因素。首先,计算哈希函数所需的时间是一个重要的考虑因素。哈希函数应该尽可能简单且快速,以减少计算时间。其次,关键字的长度和分布情况也会影响哈希表的选择。对于长度变化较大的关键字,可能需要采用更复杂的哈希函数来确保均匀分布。此外,哈希表的大小也是一个需要权衡的因素。过大的哈希表会浪费存储空间,而过小的哈希表则可能导致较高的冲突率。

        哈希表在快速查找方面具有显著优势。以电话号码簿为例,如果采用顺序查找的方式,需要逐个比较关键字直到找到目标记录,时间复杂度较高。而使用哈希表,可以直接通过散列函数计算出关键字的索引值,从而快速定位到目标记录。这种特性使得哈希表在关系数据库、搜索引擎、缓存技术等领域得到了广泛应用。

        以下是一个简单的哈希表查找示例,代码如下。

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    // 创建一个哈希表,存储学生信息
    std::unordered_map<std::string, int> studentMap;

    // 向哈希表中添加学生信息,键为姓名,值为学号
    studentMap["张三"] = 1001;
    studentMap["李四"] = 1002;
    studentMap["王五"] = 1003;
    studentMap["赵六"] = 1004;

    // 查找学号为1002的学生姓名
    std::string name = "李四";
    if (studentMap.find(name) != studentMap.end()) {
        std::cout << "学生 " << name << " 的学号是:" << studentMap[name] << std::endl;
    } else {
        std::cout << "未找到学生 " << name << std::endl;
    }

    // 查找学号为1005的学生姓名(不存在)
    name = "林七";
    if (studentMap.find(name) != studentMap.end()) {
        std::cout << "学生 " << name << " 的学号是:" << studentMap[name] << std::endl;
    } else {
        std::cout << "未找到学生 " << name << std::endl;
    }

    return 0;
}

        在上面的示例中,我们首先创建了一个`std::unordered_map<std::string, int>`类型的哈希表`studentMap`,用于存储学生的姓名和学号。然后,我们向哈希表中添加了四个学生的信息。接下来,我们使用`find`函数查找学号为1002的学生的姓名,并输出其学号。最后,我们尝试查找一个不存在的学号(1005),并输出相应的提示信息。结果如下图所示。

         这表明我们成功地使用哈希表实现了快速查找学生信息的功能。对于存在的学号,我们能够快速地找到对应的姓名和学号;对于不存在的学号,我们也能够给出相应的提示信息。

        尽管哈希表可以大大提高查找效率,但也可能出现冲突的情况。冲突是指不同的关键字通过哈希函数计算得到的索引值相同,导致它们映射到哈希表中的同一个位置。为了解决冲突,可以采用以下几种方法:

        1. 开放定址法:当发生冲突时,按照一定的规则寻找下一个可用的空位置。常见的规则有线性探测、二次探测和双重散列等。
        2. 再散列函数法:当发生冲突时,使用另一个哈希函数重新计算索引值。这种方法可以降低聚集现象的发生,但增加了计算成本。
        3. 链地址法:将所有具有相同索引值的关键字存储在一个链表中。当发生冲突时,只需将新的关键字添加到对应的链表中即可。这种方法能够解决冲突,但可能导致链表过长,影响查找效率。

        在实际应用中,我们需要根据具体情况选择合适的冲突处理方法。通常,链地址法具有较好的性能和灵活性,因此在许多场景下得到了广泛应用。

        综上所述,哈希表是一种高效的数据结构,能够实现快速查找。通过合理选择哈希函数和冲突处理方法,我们可以充分发挥哈希表的优势,提高数据处理的效率

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

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

相关文章

大语言模型本地部署与使用_ollama_open-webui

概述 本文主要记录如何使用ollama运行开源的大语言模型如llama3等&#xff0c;以及如何使用open-webui进行交互。 ollama支持MacOS、Linux、Windows等操作系统&#xff0c;这里主要以Linux和Windows为主&#xff0c;讲述如何在本地运行大语言模型。 一 安装ollama 1.1 Wind…

一张图看懂大模型性价比:能力、价格、并发量全面PK

最近&#xff0c;国内云厂商的大模型掀起一场降价风暴。火山引擎、阿里云、百度云等纷纷宣布降价&#xff0c;部分模型价格降幅据称高达99%&#xff0c;甚至还有些模型直接免费。 五花八门的降价话术&#xff0c;一眼望去遍地黄金。但事实真的如此吗&#xff1f;今天我们就拨开…

太阳诱电:顺应时代需求的新型电容器为何能在全球得到广泛应用(下)

随着汽车电动化和电子控制化的进展&#xff0c;车载计算机和电气部件也在逐渐向大功率化的方向发展。而构成这些车载设备电源电路的电子元器件也必须随之进行技术革新。太阳诱电集团携手全资子公司ELNA&#xff0c;开发并供应新型电容器“导电性高分子混合铝电解电容器”&#…

热爱无解 少年万丈光芒!首席艺人【彭禹锦】登陆第八季完美童模全球赛

2024年7月&#xff0c;一档由IPA模特委员会创办于2017年的王牌少儿模特大赛即将拉开全球总决赛的帷幕!作为家喻户晓的国民赛事——完美童模曾6季荣获CCTV央视新闻报道&#xff0c;以创意引领、美学引领、和兼具文化底蕴的赛事特色&#xff0c;收获了全球百万亲子家庭的喜爱。20…

工业镜头的参数、选型步骤

目录 一、如何选择合适的工业镜头 1. 工业镜头的基本参数 2. 选择工业镜头的步骤 3. 案例分析&#xff1a;如何选择合适的镜头 4. 远心镜头的设计目的 二、 介绍远心镜头 2.1 远心镜头的主要特性 2.2 远心镜头的类型 2.3 远心镜头的应用 2.4 远心镜头的工作原理 2.5 …

SOA半导体光放大器及其应用

---翻译自Michael Connelly于2015年发表的文章 1.简介 在过去的二十五年里&#xff0c;光纤通信网络的部署和容量迅速增长。这种增长得益于新光电技术的发展&#xff0c;这些技术可用于利用光纤的巨大带宽。如今&#xff0c;运行的系统比特率已超过 100 Gb/s。光技术是全球信…

Kubernetes的灵魂核心:kube-scheduler

Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化容器化应用程序的部署、扩展和管理。在Kubernetes集群中&#xff0c;kube-scheduler是一个至关重要的组件&#xff0c;它负责将Pod&#xff08;Kubernetes中的最小部署单元&#xff0…

谷歌推出TransformerFAM架构,以更低的消耗处理长序列文本

Transformer对大模型界的影响力不言而喻&#xff0c;ChatGPT、Sora、Stable Difusion等知名模型皆使用了该架构。 但有一个很明显的缺点&#xff0c;其注意力复杂度的二次方增长在处理书籍、PDF等超长文档时会显著增加算力负担。 虽然会通过滑动窗口注意力和稀疏注意力等技术…

win11安装docker运行Open-Webui 界面化展示 ollama大模型

1.OpenWeb UI运行需要docker 环境下载docker Get Started | Docker 2.需要命令提示符docker -v 查询是否安装成功&#xff1b; 查询docker详情docker version 3.github拉取open-webUi镜像Package open-webui GitHub 复制命令运行在命令提示符&#xff1b; 等待下载完成 4.到…

打造一个增强版Kimi:可以生成图片、PPT、PDF文档、数据分析等

Kimi虽然在国内AI大模型中表现不错&#xff0c;但是和ChatGPT还是差不少功能。现在有一个很简单的方法&#xff0c;把kimi功能增强&#xff0c;使用效果大大改善&#xff0c;比如生成图片&#xff1a; 具体方法如下&#xff1a; 打开coze网站&#xff1a;https://www.coze.cn/…

AI大模型探索之路-实战篇4:DB-GPT数据应用开发框架调研实践

目录 前言一、DB-GPT总体概述二、DB-GPT关键特性1、私域问答&数据处理&RAG2、多数据源&GBI3、多模型管理4、自动化微调5、Data-Driven Multi-Agents&Plugins6、隐私安全 三、服务器资源准备1、创建实例2、打开jupyterLab 四、DB-GPT启动1、激活 conda 环境2、切…

使用VUE3+TS+elementplus创建一个增加按钮

一、前言 在上一篇文章中分享了创建table的过程&#xff0c;详见&#xff08;VUE3TSelementplus创建table&#xff0c;纯前端的table&#xff09;&#xff0c;本文在创建好的table的基础上&#xff0c;再创建一个增加按钮。 二、程序展示 1、前面创建table的程序 <templ…

Springboot+Vue项目-基于Java+MySQL的游戏交易系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

关于智慧校园安全用电监测系统的设计

人生人身安全是大家关注的话题&#xff0c;2019年12月中国消防统计近五年发生在全国学生宿舍的火灾2314起&#xff08;中国消防2019.12.应急管理部消防救援局官方微博&#xff09;&#xff0c;违规电器是引发火灾的主因。如果在各寝室安装智能用电监测器实时监督线路参数&#…

足球走地数据分析之大小球策略及工具介绍

在足球走地数据分析中&#xff0c;大小球策略是一种非常实用的投注方式。以下是一些关于大小球策略的分析和建议&#xff1a; 理解大小球概念&#xff1a;大小球是足球走地投注中的一种玩法&#xff0c;主要预测的是一场比赛中的总进球数是否超过或低于一个预设的数值。例如&a…

浏览器API与协议

现代浏览器是一个囊括了数百个组件的操作系统&#xff0c;包括进程管理、安全沙箱、分层的优化缓存、JavaScript虚拟机、图形渲染和GPU管道、存储系统、传感器、音频和视频&#xff0c;网络机制等等。 在浏览器上运行的应用的性能。&#xff0c;取决于多个组件&#xff1a;解析…

C#利用WinForm实现可以查看指定目录文件下所有图片

目录 一、关于Winform 二、创建应用 三、功能实现 四、代码部分 一、关于Winform Windows 窗体是用于生成 Windows 桌面应用的 UI 框架。 它提供了一种基于 Visual Studio 中提供的可视化设计器创建桌面应用的高效方法。 利用视觉对象控件的拖放放置等功能&#xff0c;可…

适用于 Windows 7/8/10/11 的 6 款最佳免费分区软件

分区软件程序旨在帮助您创建、缩小、删除、扩展、合并或拆分硬盘和其他存储设备的分区。虽然可以在 Windows 中对硬盘进行分区而无需使用其他软件&#xff0c;但您可以执行的活动范围有限。例如&#xff0c;如果没有外部工具&#xff0c;您无法调整分区大小或合并分区。在这篇文…

Stable Diffusion|黑白老照片修复

在这个时代&#xff0c;我们习惯于拥有高清、色彩丰富的照片&#xff0c;然而&#xff0c;那些古老的黑白色老照片由于年代的久远&#xff0c;往往会出现模糊、破损等现象。 关于AI绘画技术储备 学好 AI绘画 不论是就业还是做副业赚钱都不错&#xff0c;但要学会 AI绘画 还是要…

解决 fatal: Not a git repository (or any of the parent directories): .git 问题

解决方法&#xff1a;在命令行 输入 git init 然后回车就好了