数据结构进阶 unordered系列的效率对比

news2024/11/17 17:48:32

作者:@小萌新
专栏:@数据结构进阶
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:对比map set和unordered系列map和set的效率

unordered系列的效率对比

  • map/set与unordered_map/unordered_set的区别
  • map/set与unordered_map/unordered_set的性能测试
    • 插入效率测试
    • 查找效率测试
    • 删除效率测试
    • 测试数为10000
      • debug
      • release
    • 测试数为10000000
      • debug
      • realease
  • 测试结论
  • 测试代码

map/set与unordered_map/unordered_set的区别

map/set与unordered_map/unordered_set虽然它们的接口函数名称近乎一致 但是它们的底层实现却大不相同

容器底层数据结构是否有序实现版本增删查改的效率迭代器类型
unordered_map/unordered_set哈希表/散列表遍历无序C++11O(1)单向迭代器
map/set红黑树遍历有序C++98O(logN)双向迭代器

map/set与unordered_map/unordered_set的性能测试

我们这里分别使用不同的数据量对这两种容器进行增删查 的效率测试

我们使用set和unordered_set来进行测试

首先我们生成N个随机数 将它们插入到一个容器vector里

代码标识如下

	vector<int> v;
	v.reserve(N);
	srand((unsigned int)time(0));

	for (size_t i = 0; i < N; i++)
	{
		v.push_back(rand());
	}

这里利用我们之前学过的一个知识点 我们使用const修饰的全局变量N

在这里插入图片描述

插入效率测试

代码表示如下

我们分别使用两个时间标志来记录它们插入的时间

	// 插入 
	set<int> s;
	clock_t begin1 = clock();
	for (auto x : v)
	{
		s.insert(x);
	}
	clock_t end1 = clock();

	unordered_set<int> us;
	clock_t begin2 = clock();
	for (auto x : v)
	{
		us.insert(x);
	}
	clock_t end2 = clock();

查找效率测试

	// 查找
	clock_t begin3 = clock();
	for (auto x : v)
	{
		s.find(x);
	}
	clock_t end3 = clock();

	clock_t begin4 = clock();
	for (auto x : v)
	{
		us.find(x);
	}
	clock_t end4 = clock();

删除效率测试

	// 删除
	clock_t begin5 = clock();
	for (auto x : v)
	{
		s.erase(x);
	}
	clock_t end5 = clock();

	clock_t begin6 = clock();
	for (auto x : v)
	{
		us.erase(x);
	}

测试数为10000

debug

在这里插入图片描述

release

在这里插入图片描述

我们可以发现 在小数据的时候它们之间的效率差别不大 在release版本下都被优化的很好

测试数为10000000

debug

在这里插入图片描述

realease

在这里插入图片描述
我们可以发现在测试数量巨大的时候它们之间的效率就开始出现差别了

unordered系列的效率明显快于set 尤其是查找操作

测试结论

  • 当测试数据较小时 选择map/set容器与unordered_map/unordered_set容器都可以
  • 当测试数据较大时 unordered_map/unordered_set容器的效率明显高于map/set

但是unordered_map/unordered_set容器对比map/set有一个缺点 就是它是无序的

所以说当我们要排序的时候冒着牺牲效率的代价也要选择map/set

测试代码

大家可以自行修改N的值进行测试

#define _CRT_SECURE_NO_WARNINGS 1
#include<time.h>
#include<set>
#include<unordered_set>
#include<iostream>
using namespace std;
const int N = 10000000;



int main()
{
	vector<int> v;
	v.reserve(N);
	srand((unsigned int)time(0));

	for (size_t i = 0; i < N; i++)
	{
		v.push_back(rand());
	}
	// 插入 
	set<int> s;
	clock_t begin1 = clock();
	for (auto x : v)
	{
		s.insert(x);
	}
	clock_t end1 = clock();

	unordered_set<int> us;
	clock_t begin2 = clock();
	for (auto x : v)
	{
		us.insert(x);
	}
	clock_t end2 = clock();

	//分别输出插入set容器和unordered_set容器所用的时间
	cout << "set insert: " << end1 - begin1 << endl;
	cout << "unordered_set insert: " << end2 - begin2 << endl;


	// 查找
	clock_t begin3 = clock();
	for (auto x : v)
	{
		s.find(x);
	}
	clock_t end3 = clock();

	clock_t begin4 = clock();
	for (auto x : v)
	{
		us.find(x);
	}
	clock_t end4 = clock();

	//分别输出在set容器和unordered_set容器中查找这N个数所用的时间
	cout << "set find: " << end3 - begin3 << endl;
	cout << "unordered_set find: " << end4 - begin4 << endl;


	// 删除
	clock_t begin5 = clock();
	for (auto x : v)
	{
		s.erase(x);
	}
	clock_t end5 = clock();

	clock_t begin6 = clock();
	for (auto x : v)
	{
		us.erase(x);
	}
	clock_t end6 = clock();
	//分别输出将这N个数从set容器和unordered_set容器中删除所用的时间
	cout << "set erase: " << end5 - begin5 << endl;
	cout << "unordered_set erase: " << end6 - begin6 << endl;
	return 0;
}

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

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

相关文章

HTTP简史

今天一起来研究Http协议的一些事情&#xff0c;通过本文你将了解到以下内容&#xff1a;Http协议各版本的对比和优缺点Http2.0协议相关的SPDY协议、二进制分帧协议、多路复用、首部压缩、服务推送等基本原理HTTP3.0和QUIC协议乘风破浪前往知识的海洋吧&#xff0c;要开船了&…

Linux常用命令——telnet命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) telnet 登录远程主机和管理(测试ip端口是否连通) 补充说明 telnet命令用于登录远程主机&#xff0c;对远程主机进行管理。telnet因为采用明文传送报文&#xff0c;安全性不好&#xff0c;很多Linux服务器都不开…

【Java IO流】字符流详解

文章目录1. 前言2. 字符输入流3. 字符输出流4. 字符流底层原理解析4.1 字符输入流4.2 字符输出流1. 前言 在上一篇字符集详解中我们说到了产生乱码的原因&#xff0c;要么是读取数据时未读完整个汉字&#xff0c;要么是因为编码和解码的方式不统一&#xff0c;对于后者我们只需…

PromQL之函数

Prometheus 版本 2.41.0 平台统一监控的介绍和调研直观感受PromQL及其数据类型PromQL之选择器和运算符PromQL之函数 PromQL 聚合函数 PromQL 的聚合函数只能用于瞬时向量&#xff0c;支持的聚合函数有&#xff1a; sum 求和min 最小值max 最大值avg 平均值group 分组&#xf…

Nginx与LUA(5)

您好&#xff0c;我是湘王&#xff0c;这是我的CSDN博客&#xff0c;欢迎您来&#xff0c;欢迎您再来&#xff5e;Nginx诞生以来就获赞无数&#xff0c;反向代理、负载均衡、流量限制与流量扩展都是它的拿手好戏。基本上是互联网应用的主流入口&#xff0c;和计算、即时通讯、存…

python批量下载modis数据(可筛选日期、范围、数据类型)

找了一圈下modis数据的&#xff0c;有的不能空间筛选有的不能下初级产品&#xff08;也可能没找到&#xff09;&#xff0c;不甚满意&#xff0c;自己搞了个 0 前言 用到的主要依赖是selenium&#xff0c;下载网站是https://ladsweb.modaps.eosdis.nasa.gov&#xff0c;环境是…

ensp实现不同VLAN之间的通信

1.VLAN的基本配置 一个简单的VLAN实验&#xff0c;基本配置如图。 其中交换机为S5700。 在只对四台PC配置IP地址&#xff0c;交换机不用配置后&#xff0c;四台PC可以互相ping通。 下面是对交换机配置VLAN的方法 <Huawei>sys #进入系统视图 [Huawei…

钉钉搭和金蝶云星空接口打通对接实战

数据源系统:阿里宜搭宜搭是阿里巴巴自研的基于钉钉和阿里云的低代码平台&#xff0c;可让用户通过简单的拖拽、配置即可完成应用搭建&#xff0c;为每个组织提供低门槛、高效率的数字化业务应用生产新模式。有效缩减企业应用开发时间&#xff0c;助力企业数字化升级。对接目标系…

第四层:友元与函数成员别样定义

文章目录前情回顾友元友元的概念友元的目的友元的关键字友元的两种种用法全局函数做友元类做友元函数成员的别样定义有缘人学友元&#xff0c;急速突破第四层本章知识点&#xff08;图片形式&#xff09;&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的…

Python怎么获取节假日信息?

“holidays” 是一个 Python 第三方库&#xff0c;它可以用来解析和处理节假日信息。 该库提供了一系列函数&#xff0c;可以用来检查某一天是否是节假日、获取某一年中所有节假日的列表等。它支持多种国家和地区的节假日&#xff0c;例如美国、加拿大、澳大利亚、英国等。 “…

【软件架构思想系列】分层架构

- 分层架构 -今天谈下架构设计中的分层思想和分层模型。架构思维概述对于架构思维本身仍然是类似系统思维&#xff0c;结构化思维&#xff0c;编程思维等诸多思维模式的一个合集。由于架构的核心作用是在业务现实世界和抽象的IT实现之间建立起一道桥梁&#xff0c;因此…

CUDA编程笔记(4)

文章目录前言1.CUDA的计时程序2.CUDA程序的计时影响GPU加速的关键总结前言 怎么才能看出使用cuda编程&#xff0c;提高了程序的性能&#xff0c;一般都是通过比较程序运行的时间来验证。所以熟悉程序的运行时间的计时&#xff0c;可以查看优化的性能效果。 1.CUDA的计时程序 …

每日亿题(面试题)

每日亿题(面试题) new Fn和new Fn()有什么区别&#xff1f; 1.首先如果是为传参数的情况下结果是相同的 2.如果是获取属性new Fn() 正常执行&#xff0c;而 new Fn 报错 3.不带括号不能给构造函数传参 分析比较 opacity: 0、visibility: hidden、display: none 优劣和适用…

Spring看这一篇文章就够了

第一章 Spring简介 第1节 Spring的介绍 Spring官网地址 1https://spring.ioSpring的介绍 1Spring是一个开放源代码的设计层面框架&#xff0c;他解决的是业务逻辑层和其他各层的松耦合问题&#xff0c;因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003年兴起的一…

4.2w字,详细的带你认识基础I/O【Linux--基础IO】

前言 相信大家最开始都挺疑惑的&#xff0c;什么I/O。在计算机操作系统中&#xff0c;所谓的I/O实则就是输入&#xff08;Input&#xff09;和输出&#xff08;Output&#xff09;&#xff0c;也可以理解为读&#xff08;Read&#xff09;和写&#xff08;Write&#xff09;&…

Linux常用命令——tar命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tar Linux下的归档使用工具&#xff0c;用来打包和备份。 补充说明 tar命令可以为linux的文件和目录创建档案。利用tar&#xff0c;可以为某一特定文件创建档案&#xff08;备份文件&#xff09;&#xff0c;也…

mysql 基本组成

1 mysql 基本组成 1.1、mysql连接器的工作流程: 1.2、查看连接状态: show processlist; Note:客户端太长时间没动静 就自动断开 这个时间是由wait_timeout参数控制的,默认8h 长连接短链接 长连接是链接成功后,如果客户端持续有请求,则使用同一个链接[尽量使用长连接,因为每次…

组件间通信

1、Vue组件的嵌套关系 1.1、认识组件的嵌套 前面我们是将所有的逻辑放到一个App.vue中&#xff1a; 在之前的案例中&#xff0c;我们只是创建了一个组件App&#xff1b;如果我们一个应用程序将所有的逻辑都放在一个组件中&#xff0c;那么这个组件就会变成非常的臃肿和难以维…

【网络通信】【电信运营商实战工程师】思科设备篇-思科设备园区网实战

电信运营商实战工程师系列文章. 思科设备篇-思科设备园区网实战. 文章目录1. 思科设备链路捆绑实战2. 思科设备VRRP、HSRP实战3. 思科设备ACL实战全集4. 思科设备RIP协议实战5. 思科设备OSPF协议全集-理论6. 思科设备OSPF协议全集-实战1. 思科设备链路捆绑实战 知识点&#xff…

【中科微北斗+GPS模块经纬度数据解析详细教程-附免费代码工程】

中科微北斗GPS模块经纬度数据解析详细教程-附免费代码工程简介准备工作PC端需要用到的工具代码下载地址GD32F103C8T6最小系统板代码实现GD32串口引脚定义如下&#xff1a;串口的初始化串口0初始化代码&#xff1a;串口1初始化代码串口的输入串口0的输入代码如下&#xff1a;串口…