Hash入门

unordered_set

void test_unordered_set()
{unordered_set<int> us;us.insert(4);us.insert(2);us.insert(1);us.insert(5);us.insert(6);us.insert(2);us.insert(2);//去重unordered_set<int>::iterator it = us.begin();while (it != us.end()){cout << *it << " ";++it;}cout << endl;
}

unordered_set:可以做到去重+排序。

set:可以做到排序+去重。

unordered_map

void test_unordered_map()
{unordered_map<string, string> dict;dict.insert(make_pair("sort", "排序"));dict["string"] = "字符串";dict.insert(make_pair("left", "左边"));unordered_map<string, string>::iterator dit = dict.begin();while (dit != dict.end()){cout << dit->first << " : " << dit->second << endl;++dit;}cout << endl;
}

unordered_map按插入的顺序输出,map会先根据key排序然后再输出。

总结:

map和set和unordered_map/unordered_set的区别和联系

1.都可以实现key和key/value的搜索场景,功能和使用基本一样

2.map/set底层是红黑树实现的遍历后是有序的,增删查改的时间复杂都为O(logN)

3.unordered_map/unordered_set的底层是使用哈希表实现的,遍历出来是无序的,增删查改的时间复杂都为O(l)

4.map/set是双向迭代器,unordered_map/unordered_set是单向迭代器。

961. 在长度 2N 的数组中找出重复 N 次的元素

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/n-repeated-element-in-size-2n-array/description/

int repeatedNTimes(vector<int>& nums) {unordered_map<int,int> countMap;for(auto e:nums)countMap[e]++;for(auto e:countMap)if(e.second==nums.size()/2)return e.first;return -1;}

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=O83Ahttps://leetcode.cn/problems/intersection-of-two-arrays/

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> s1;for(auto e:nums1)s1.insert(e);unordered_set<int> s2;for(auto e:nums2)s2.insert(e);vector<int> vRet;for(auto e:s1)if(s2.find(e)!=s2.end())vRet.push_back(e);return vRet;}

 哈希函数

常见哈希函数

1. 直接定制法--(常用) 取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先 知道关键字的分布情况 使用场景:适合查找比较小且连续的情况 面

2. 除留余数法--(常用) 设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函 数:Hash(key) = key% p(p将关键码转换成哈希地 址

 哈希冲突

在往hash数组中存11时,就会发生hash冲突。

哈希冲突

对于两个数据元素的关键字 和 (i != j),有 != ,但有:Hash( ) == Hash( ),即:不同关键字通过 相同哈希哈数计算出相同的哈希地址,该种现象称为哈希冲突或哈希碰撞。

哈希冲突解决

闭散列

闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那 么可以把key存放到冲突位置中的“下一个” 空位置中去那如何寻找下一个空位置呢?

线性探测

线性探测:从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止。

插入

通过哈希函数获取待插入元素在哈希表中的位置

如果该位置中没有元素则直接插入新元素,如果该位置中有元素发生哈希冲突,使用线性探 测找到下一个空位置,插入新元素

二次探测

按2次方往后找空位置。

代码实现

enum State
{EMPTY,EXITS,DELETE,
};template<class T>
struct HashData
{T _data;State _state;
};
template<class K,class T>
class HashTable
{private:vector<HashData> _tables;size_t _num;//存储的有效数据的个数
};

三个转态对应查找时的三种情况

insert
负载因子

负载因子=表中数据/表的大小 -> 衡量哈希表满的程度
表接近满,插入数据容易冲突,冲突越多,效率越低

bool Insert(const T& x)
{KeyOfT koft;//计算x在表中的位置size_t index = koft(x) % _tables.size();while (_tables[index]._state == EXITS){if (_tables[index]._data == x)return false;++index;if (index == _tables.size())index = 0;}_tables[index]._data = x;_tables[index]._state = EXITS;_num++;
}
find
HashData* Find(const K& key)
{KeyOfT koft;size_t index = key % _tables.size();while (_tables[index]._state != EMPTY){if (koft(_tables[index]._data) == key){if (_tables[index]._state == EXITS){return &_tables[index];}else if (_tables[index]._state == DELETE){return nullptr;}}++index;if (index == _tables.size()){index = 0;}}return nullptr;
}
erase
bool Erase(const K& key)
{HashData* ret = Find(key);if (ret){ret->_state = DELETE;return true;}elsereturn false;
}

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

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

相关文章

MyBatis-Plus代码一键生成

官网地址&#xff1a;MyBatis-Plus &#x1f680; 为简化开发而生 开始&#xff1a; 添加依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.7</version&g…

IMS 在线计费 IMS 离线计费

目录 1. IMS 在线计费 1.1 主要内容 1.2 IMS 在线计费架构 ​编辑1.3 IMS 在线计费方案 1.4 IMS 在线计费的关键步骤 1.5 在线计费的基本流程 1.6 IMS Information AVP 2. IMS 离线计费 2.1 IMS 离线计费架构 2.2 IMS 离线计费概述 2.3 什么时候 AS 给 CG 发送 ACR?…

独立站技能树/工具箱1.0 总纲篇丨出海笔记

正所谓要把一件事做到90分很难&#xff0c;但做到60分基本上照着SOP做到位都没问题&#xff0c;如果我们能把每件事都做到60分&#xff0c;那绝对比至少60%的人都强&#xff0c;除非你的对手不讲武德——那就是他很可能看了我这篇文章&#xff0c;不但每方面都超过及格线&#…

油耳拿什么清理比较好?比较推荐哪种可视耳勺

相信很多小伙伴都有挖耳朵方面的困扰&#xff0c;尤其是油性耳朵的人&#xff0c;用棉签掏耳朵时感觉越掏越往里去&#xff0c;而使用普通耳勺又因为材质过硬&#xff0c;在使用过程中容易刮伤耳道。于是市面上出现了可视挖耳勺&#xff0c;让人们可以在看得见的情况下取出耳道…

解决novnc1.2.0不能使用剪切板的问题

1.下载资源文件asciidef.js,在rfb.js中引入 2.修改rfb.js中clipboardPasteFrom方法如下 clipboardPasteFrom(text) {if (this._rfbConnectionState !== connected || this._viewOnly) {return; }if (this._clipboardServerCapabilitiesFormats[extendedClipboardFormatText] &…

MT6765/MT6762(R/D/M)/MT6761(MT8766)安卓核心板参数比较_MTK联发科4G智能模块

联发科Helio P35 MT6765安卓核心板 MediaTek Helio P35 MT6765是智能手机的主流ARM SoC&#xff0c;于2018年末推出。它在两个集群中集成了8个ARM Cortex-A53内核&#xff08;big.LITTLE&#xff09;。四个性能内核的频率高达2.3GHz。集成显卡为PowerVR GE8320&#xff0c;频率…

研发企业的源代码防泄密秘籍:一机两用的沙盒电脑

在数字化时代&#xff0c;数据安全已成为企业最关注的问题之一。尤其是对于研发密集型企业&#xff0c;源代码的安全更是核心资产。SDC沙盒&#xff0c;正是为了应对这一挑战而设计的先进数据防泄密解决方案。 全面保护&#xff0c;从源头开始 SDC沙盒采用独特的代码级安全设…

python线程(python threading模块、python多线程)(守护线程与非守护线程)

文章目录 Python多线程入门1. Python多线程概述2. threading模块基础- Thread 类: 这是一个代表线程的类。可以通过创建Thread类的实例来新建一个线程。- Lock 类: 在多线程环境中&#xff0c;为了防止数据错乱&#xff0c;通常需要用到锁机制。Lock类提供了基本的锁功能&#…

如日中天的AI大模型,也到了发展幻灭期!

近期 Gartner发布了《新兴技术成熟度曲线》&#xff0c;其中生成式 AI &#xff08;GenAI&#xff09; 正式进入到了幻灭期。 2018 年 6 月&#xff0c;OpenAI发布GPT-1模型&#xff0c;生成式AI开始向产品化发展。 到2022年的GPT-3.5发布&#xff0c;并且ChatGPT首次向公众推…

企业微信-前往服务商后台页面对接解决方案

序 我会告诉你在哪里点我会告诉你在哪里配置点下去他只返回auth_code的&#xff0c;我怎么登录 正文 他是在这个位置 是这样&#xff0c;应用授权安装第三方应用后&#xff0c;企业微信&#xff08;管理员角色&#xff09;是可以从pc端企业后台点第三方应用的。 如果我没记…

【qt】一个WPS项目了解qt界面设计的基本套路

项目功能演示: 放心食用!最后有完整代码. 超级详细,期待您的一个点赞❥(^_-) 一览全局: WPS项目目录 一.创建项目二.导入资源三.ui设计四.字号选择框初始化五.滚动条初始化六.添加自定义文本类七.初始化action状态八.新建文档九.打开文件十.保存与另存为十一.打印/打印预览十…

QT设置git仓库

笔者最近想写一个qt的程序&#xff0c;想要把这个代码推送到github上。 前提是电脑已安装了git、QT 以下是设置步骤&#xff1a; 1.设置QT中关于git的配置 打开QT&#xff0c;点击工具-》选项-》版本控制-》填写PATH 这个PATH是你安装git的绝对路径&#xff0c;如果你不记得…

HTTP中的Cookie与Session

一、背景 HTTP协议是无状态无连接的。 无状态&#xff1a;服务器不会保存客户端历史请求记录&#xff0c;每一次请求都是全新的。 无连接&#xff1a;服务器应答后关闭连接&#xff0c;每次请求都是独立的。 无状态就导致服务器不认识每一个请求的客户端是否登陆过。 这时…

Mybatis框架映射---代码实现(XML配置以及注解形式)

目录 一. 映射关系 1 对 1-映射方式 1.通过xml文件实现映射的一对一关系 总结 &#xff1a; 2.通过注解的方式来实现下面的 1 对 1 的映射关系&#xff0c;实现级联查询 总结&#xff1a; 二. 映射关系多对一 1.通过xml文件实现映射的多对一关系 2.通过注解的方式来实现…

【Elasticsearch系列十五】强大特性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MapReduce基本原理

目录 整体执行流程​ Map端执行流程 Reduce端执行流程 Shuffle执行流程 整体执行流程 八部曲 读取数据--> 定义map --> 分区 --> 排序 --> 规约 --> 分组 --> 定义reduce --> 输出数据 首先将文件进行切片&#xff08;block&#xff09;处理&#xff…

EsDA,一站式嵌入式软件

EsDA是一套面向工业智能物联领域的嵌入式系统设计自动化工具集&#xff0c;包含实时操作系统AWorksLP、低代码开发平台AWStudio、资源管理平台AXPI、跨平台GUI引擎AWTK和云服务平台ZWS&#xff0c;旨在提高嵌入式软件开发的效率、性能和可扩展性。 EsDA全称是嵌入式系统设计自动…

司南 OpenCompass 九月大语言模型评测榜单启动召集,欢迎新合作厂商申请评测

主要概览 司南 OpenCompass 大语言模型官方自建榜单&#xff08;9 月榜&#xff09;评测拟定于 10 月上旬发布&#xff0c;现诚挚邀请新加入的合作方参与评测。本次评测围绕强化能力维度&#xff0c;全面覆盖语言、推理、知识、代码、数学、指令跟随、智能体等七大关键领域&am…

ThreaLocal

1.概述 ThreadLoca称线程局部变量&#xff0c;用于在线程中保存数据&#xff0c;保存的数据仅属于当前线程(即对其他线程而言&#xff0c;该变量是当前线程独有的变量) threadLocal利用Thread中的ThreadLocalMap来进行数据存储 2.常用方法 存储数据至当前线程ThreadLocalMap中…

Unity引擎绘制多边形属性图

大家好&#xff0c;我是阿赵   在制作游戏的时候&#xff0c;经常会遇到需要绘制多边形属性图的需求&#xff0c;比如这种效果&#xff1a; 可以根据需要的属性的数量变化多边形的边数&#xff0c;然后每一个顶点从中心点开始到多边形的顶点的长度代表了该属性的强度&#xf…