移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.哈希(1)

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——14.哈希(1)

unordered系列关联式容器

在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到== l o g 2 N log_2 N log2N==,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好 的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个 u n o r d e r m a p \color{red}{unordermap} unordermap系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是 其**底层结构不同**

unordered map 的图像结果

1. unordered_map

​ unordermap文档

unordered_map

unordered_map是一种关联容器,它存储的是键值对(key-value pairs),并且键是唯一的。它使用哈希表来快速查找键。

特点:
  • 键值对存储:每个元素是一个std::pair<const Key, T>,其中Key是键,T是对应的值。
  • 无序存储:元素在哈希表中是无序存储的,插入的顺序不保证元素的顺序。
  • 唯一键:同一个键只能存在一个,如果插入相同键,会覆盖原有键对应的值。
  • 时间复杂度:查找、插入、删除的平均时间复杂度是O(1),但在最坏情况下,复杂度可能退化为O(n),比如在哈希冲突严重的情况下。
常用操作:
  • 插入umap.insert({key, value})umap[key] = value
  • 查找umap.find(key) 返回迭代器,如果找不到则返回umap.end()
  • 删除umap.erase(key)umap.erase(迭代器)
  • 访问元素umap[key] 如果键不存在,会自动插入该键并赋值为T()(默认构造值)
  • 大小umap.size() 返回元素个数
适用场景

unordered_map适合需要频繁进行键值对查找、插入、删除的场景,特别是在不关心元素顺序的情况下。比如统计元素频次、缓存(cache)实现等。

2. unordered_map的接口说明

1.unordered_map的构造

函数声明功能介绍
unordered_map构造不同格式的unordered_map对象

2.unordered_map的容量

函数声明功能介绍
bool empty() const检测unordered_map是否为空
size_t size() const获取unordered_map的有效元素个数

3. unordered_map的迭代器

begin返回unordered_map第一个元素的迭代器
end返回unordered_map最后一个元素下一个位置的迭代器
cbegin返回unordered_map第一个元素的const迭代器
cend返回unordered_map最后一个元素下一个位置的const迭代器

4.unordered_map的元素访问!!!

函数声明功能介绍
operator[]返回与key对应的value,若没有key则插入一个,并返回value默认值

在这里插入图片描述

5.unordered_map的查询

iterator find(constK& key)返回key在哈希桶中的位置
size_t count(constK& key)返回哈希桶中关键码为key的键值对的个数

注意:**key是不能重复**的,因此count函数的返回值最大为1

6.unordered_map的修改操作

insert向容器中插入键值对
erase删除容器中的键值对
clear清空容器中有效元素个数
void swap(unordered map&)交换两个容器中的元素

在这里插入图片描述

3. unordered_set

unordered_set也是一个哈希容器,但它只存储唯一的键(没有值),也就是说它只关心元素是否存在,而不关心元素的具体值。

特点:
  • 元素唯一:集合中的每个元素是唯一的,不能包含重复元素。
  • 无序存储:元素以无序的方式存储,插入顺序不影响元素的排列顺序。
  • 哈希表实现:与unordered_map一样,unordered_set基于哈希表实现。
  • 时间复杂度:查找、插入、删除的平均时间复杂度是O(1),但在最坏情况下也可能退化为O(n)。
常用操作:
  • 插入uset.insert(element) 插入元素
  • 查找uset.find(element) 查找元素,返回迭代器,如果找不到则返回uset.end()
  • 删除uset.erase(element)uset.erase(迭代器)
  • 判断是否存在uset.count(element) 返回元素是否存在,存在返回1,不存在返回0
  • 大小uset.size() 返回集合中元素的个数
适用场景

unordered_set适合需要频繁进行集合操作的场景,比如元素去重、快速查找某个元素是否存在等。

4.小习题

https://leetcode.cn/problems/n-repeated-element-in-size-2n-array/description/

class Solution {
public:
    int repeatedNTimes(vector<int>& nums) {
       
        int length = nums.size()/2;
        unordered_map<int, int> it;
        for (auto& e : nums) 
        {
            it[e]++;
            
        }
        
        for (auto e : it) 
        {
            if (e.second == length) 
            {
                return e.first;
            }
        }
        return 1;//这里只是象征性地写一个return 1,不然会报错
    }
};

https://leetcode.cn/problems/uncommon-words-from-two-sentences/description/

在这里插入图片描述

class Solution {
public:
    vector<string> uncommonFromSentences(string s1, string s2) {
     vector<string> arr;
     vector<string> brr;
     vector<string> crr;
     string it;
     it.clear();
     for(auto e:s1)
     {
        if(e==' '||e=='\0')
        {
            arr.push_back(it);
            it.clear();
        }
        else
        it+=e;
     }

            arr.push_back(it);
            it.clear();

     map<string,int> a1;
     for(auto e:arr)
     {
        a1[e]++;
     }
     

     for(auto e:s2)
     {
        if(e==' '||e=='\0')
        {
            brr.push_back(it);
            it.clear();
        }
        else
        it+=e;
     }

            brr.push_back(it);
            it.clear();

     map<string,int> a2;
     for(auto e:brr)
     {
        a2[e]++;
     }

      auto it1=a1.begin();
      auto it2=a2.begin();

  while(it1!=a1.end()&&it2!=a2.end())
 {
    if(it1->first!=it2->first)
    {
        if(it1->first<it2->first)
        {
            if(it1->second==1)
            crr.push_back(it1->first);
            it1++;
        }
        else
        {
            if(it2->second==1)
            crr.push_back(it2->first);
            it2++;
        }
    }
    else
    {
       it1++;
       it2++;
    }
 }

while(it1!=a1.end())
{
    if(it1->second==1)
    crr.push_back(it1->first);
    it1++;
}

while(it2!=a2.end())
{
     if(it2->second==1)
    crr.push_back(it2->first);
     it2++;
}



return crr;


    }
};

5.底层结构

unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构

哈希概念:

顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素 时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即 O( l o g 2 N log_2 N log2N),搜索的效率取决于搜索过程中元素的比较次数。 理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一**映射**的关系,那么在查找时通过该函数可以很快找到该元素。

当向该结构中:

  • 插入元素 根据待插入元素的关键码,以此函数==计算出该元素的存储位置==并按此位置进行存放
  • 搜索元素 对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置 取元素比较,若关键码相等,则搜索成功

储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一**映射**的关系,那么在查找时通过该函数可以很快找到该元素。


3. 二者的对比:

特性unordered_mapunordered_set
存储内容键值对(key-value pairs)唯一元素(unique elements)
键是否唯一
时间复杂度平均O(1)(最坏O(n))平均O(1)(最坏O(n))
顺序保证无序无序
适用场景键值对的快速查找、插入、删除元素集合的快速查找、插入、删除

4. 小结:

  • 如果需要存储键值对并希望能够通过键快速访问相应的值,unordered_map是更好的选择。
  • 如果仅需要存储唯一的元素并希望进行集合操作(如查找、插入、删除),unordered_set更为合适。

两者的核心思想都是通过哈希函数来定位元素,从而提供快速的访问和操作。

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

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

相关文章

新兴的安全职业挑战

我们经常与安全专业人士交谈&#xff0c;他们希望在努力提升职业发展的同时提高自己的价值并克服组织内部的挑战。在这些谈话中&#xff0c;花费大量时间讨论公司未来将面临的安全问题并不罕见。 安全领导者希望为问题制定计划并获得领导层对其计划的支持。这通常意味着实施修…

【RoadRunner】自动驾驶模拟3D场景构建 | 软件简介与视角控制

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…

IDEA下载安装

文章目录 1、下载安装包2、安装IDEA3、全局配置4、安装插件5、关闭合并菜单栏 1、下载安装包 IDEA官网下载最新IDEA。 上面的ULtimate是旗舰版&#xff0c;试用30天&#xff0c;之后是需要收费的&#xff0c;下面黑色区域的Community是社区版&#xff0c;功能不如旗舰版丰富&a…

nuScenes数据集使用的相机的外参和内参

因为需要用不同数据集测试对比效果&#xff0c;而一般的模型代码里实现的检测结果可视化都是使用open3d的Visualizer在点云上画的3d框&#xff0c;展示出来的可视化效果很差&#xff0c;可能是偷懒&#xff0c;没有实现将检测结果投影到各相机的图像上&#xff0c;所以检测效果…

删除链表的倒数第 N 个结点 | LeetCode-19 | 双指针 | 递归 | 栈 | 四种方法

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 这道题还可以用递归法&#xff0c;你想到了吗&#xff1f;毛毛张介绍四种方法 LeetCode链接&#xff1a;19. 删除链表的倒数第 N 个结点 1.题目描述 给你一个链表&a…

【机器学习(十三)】机器学习回归案例之股票价格预测分析—Sentosa_DSML社区版

文章目录 一、背景描述二、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入(二) 特征工程(三) 样本分区(四) 模型训练和评估(五) 模型可视化 三、总结 一、背景描述 股票价格是一种不稳定的时间序列,受多种因素的影响。影响股市的外部因素很多,主要有经济因素、政治因…

C++11新特性(4)

目录 1.包装器 2.线程库 2.1thread类的简单介绍 2.2线程函数参数 2.3原子性操作库(atomic) 2.4lock_guard与unique_lock 2.5mutex的种类 1. std::mutex 2. std::recursive_mutex 3. std::timed_mutex 4. std::recursive_timed_mutex 2.6lock_guard 2.7unique_lock 3.支持两个线…

鼠标市场洞察:数据分析揭示消费趋势!

鼠标整体数据分析 一. 概述 本报告基于从淘宝商品搜索接口和淘宝精确月销量接口中提取的数据&#xff0c;分析了前百个品牌在销售额上的占比情况。分析涵盖了销售额和占比的数据&#xff0c;为决策提供了依据。(以上两个接口有需求的可以找我要链接&#xff09;&#xff08;数…

概率 随机变量以及分布

一、基础定义及分类 1、随机变量 随机变量是一个从样本空间&#xff08;所有可能结果的集合&#xff09;到实数集的函数。&#xff08;随机变量的值可以是离散的&#xff0c;也可以是连续的。 &#xff09; 事件可以定义为随机变量取特定值的集合。 2、离散型随机变量 随机变…

Unity开发Hololens项目

Unity打包Hololens设备 目录Visual Studio2019 / Visual Studio2022 远端部署设置Visual Studio2019 / Visual Studio2022 USB部署设置Hololens设备如何查找自身IPHololens设备门户Unity工程内的打包设置 目录 记录下自己做MR相关&#xff1a;Unity和HoloLens设备的历程。 Vi…

软件企业选择第三方软件检测机构有哪些好处?

在软件开发的当今时代&#xff0c;确保软件的质量和性能是每个企业面临的挑战&#xff0c;因此软件检测公正必不可少。随着市场的需求&#xff0c;越来越多企业会选择将该项工作交由第三方软件检测机构进行。第三方软件检测机构指独立于软件开发方和需求方的第三方机构&#xf…

5、JavaScript(二)

17.对象 1、对象&#xff1a;⽤来存储多个数据的 是由多个键值对/key value对组成的 ⽤来描述⼀个事物的 相当于多个变量的集合 2、格式 &#xff1a;{key:value,key:value} 键/值对 属性名&#xff1a;属性值 3、对象的属性值是不限制数据类型的&#xff0c;甚至还可以是对…

CEEMDAN +组合预测模型(BiLSTM-Attention + ARIMA)

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较 全是干货 | 数据集、学习资料、建模资源分享&#xff01; EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现&#xff08;一&#xff09;EMD-CSDN博客 EMD、EEM…

JavaWeb合集05-SpringBoot基础知识

五、SpringBoot基础知识 0、实用方法 0.1 动态获取某个文件路径 //getResource( name:" emp.txt") 更具名称获取资源链接&#xff1b;getFile() 获取文件对象 String filePaththis.getClass().getClassLoader().getResource( name:" emp.txt").getFile(…

数仓建设:如何设计数据治理考评规则?

目录 0 为什么要数据治理&#xff1f; 2 什么是数据治理&#xff1f; ​​​​​​​3 如何数据治理如何落地&#xff1f; ​​​​​​​4 数据考评的指标 5 考核指标列表 6 数仓团队应如何建设&#xff1f; 6.1 ​​​​​​​考评指标分析 6.2 ​​​健康分计算规则…

[Linux#67][IP] 报头详解 | 网络划分 | CIDR无类别 | DHCP动态分配 | NAT转发 | 路由器

目录 一. IP协议头格式 学习任何协议前的两个关键问题 IP 报头与有效载荷分离 分离方法 为什么需要16位总长度 如何交付 二. 网络通信 1.IP地址的划分理念 2. 子网管理 3.网络划分 CIDR&#xff08;无类别域间路由&#xff09; 目的IP & 当前路由器的子网掩码 …

ubuntu服务器监控程序崩溃自动重启

环境&#xff1a;监控程序运行情况分为两种情况&#xff0c;一种带界面&#xff0c;一种控制台程序&#xff0c;带界面程序采用脚本监控方式&#xff0c;不带界面采用Supervisor工具监控。 1. 自动重启带界面程序&#xff1a; #!/bin/sh while true; do processExistps aux | …

一些简单的编程题(Java与C语言)

引言&#xff1a; 这篇文章呢&#xff0c;小编将会举一些简单的编程题用来帮助大家理解一下Java代码&#xff0c;并且与C语言做个对比&#xff0c;不过这篇文章所出现的题目小编不会向随缘解题系列里面那样详细的讲解每一到题&#xff0c;本篇文章的主要目的是帮助小编和读者们…

【YOLOv11改进[CONV]】使用SAconv模块魔改YOLOv11 + 含全部代码和详细修改方式

本文将进行在YOLOv11中使用SAconv魔改v11,文中含全部代码、详细修改方式。助您轻松理解改进的方法。 改进前和改进后的参数对比如下: 目录 一 SAconv 二 使用SAconv魔改v11

构建 effet.js 人脸识别交互系统的实战之路

构建 effet.js 人脸识别交互系统的实战之路 文章目录 构建 effet.js 人脸识别交互系统的实战之路前言一、什么是effet.js二、为什么需要使用effet.js四、effet.js能做什么五、使用步骤1.引入库2.main.js中注册全局2.使用3.效果图 六、其他模式讲解人脸打卡人脸添加睡眠检测 在h…