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

news/2023/6/9 18:45:00

作者:@小萌新
专栏:@数据结构进阶
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:对比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.exyb.cn/news/show-4578825.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

Lua学习笔记(六):协程

多线程和协程 多线程是抢占式多任务(preemptive multitasking)&#xff0c;每个子线程由操作系统来决定何时执行&#xff0c;由于执行时间不可预知所以多线程需要使用同步技术来避免某些问题。在单核计算机中&#xff0c;同一时刻只有一个线程允许运行&#xff0c;而在多核计算…

【lua 编程 模块详解】——详细lua编程的模块使用

点个赞留个关注吧&#xff01;&#xff01;&#xff01; lua是一款很好用的软件&#xff0c;用来多控手机&#xff0c;今天给大家详细讲一下某些常用模块的使用 需要使用触动精灵中控进行控制 1、writePasteboard 这段代码可以将【文本】两字存入到你手机的剪贴板&#xff0c…

编写一个简单的C++供Lua调用的计时器

//-----------------------------------------Timer------------------------------------ #include "stdafx.h" #include "windows.h" #include <iostream> #include <fstream> #include <string> using namespace std;extern "C

Python 在windows上跑图色脚本?简单又好玩,自己编写一个自动化脚本

Python 在windows上跑图色脚本&#xff1f;简单又好玩&#xff0c;自己编写一个自动化脚本 大家好 我又来开新坑了&#xff0c;如图这次准备用python弄个简单脚本&#xff08;根据图色判断进行键鼠操作&#xff09;1.老规矩 先安排运行环境 编译平台&#xff1a;pycharm pyth…

矩阵求导知识——详细笔记

矩阵求导知识——详细笔记 文章目录矩阵求导知识——详细笔记前言一、矩阵对矩阵求导二、矩阵对标量或标量对矩阵求导1.矩阵Y对标量x求导2.标量y对列向量X求导&#xff1a;3.行向量Y对列向量X求导&#xff1a;4.列向量Y对行向量X’求导&#xff1a;5.向量积对列向量X求导运算法…

矩阵求导计算法则 例题

转载自http://blog.sina.com.cn/s/blog_4a033b090100pwjq.html&#xff0c;仅用作个人学习。 求导公式(撇号为转置&#xff09;&#xff1a; Y A * X --> DY/DX A Y X * A --> DY/DX A Y A * X * B --> DY/DX A * B Y A * X * B --> DY/DX B * A 乘积的导…

rstudio深度学习_我需要学习R吗?

rstudio深度学习您已经听说过R。也许您读过类似Sam Siewert的文章“ 云中的大数据 ”。 您知道R是一种编程语言&#xff0c;并且它与统计信息有关&#xff0c;但是它适合您吗&#xff1f; 为什么选择R&#xff1f; R做统计。 您可以将其视为SAS Analytics等分析系统的竞争对手…

python 爬虫抓取网页数据导出excel_python爬虫:利用函数封装爬取多个网页,并将爬取的信息保存在excel中(涉及编码和pandas库的使用)...

在之前的文章中&#xff0c;我们已经爬取了单网页的湖北大学贴吧的信息。我爱小徐子&#xff1a;&#xff08;python小白必看&#xff01;&#xff09;python爬虫详细讲解&#xff1a;静态单网页的内容爬取 爬取对象&#xff1a;百度贴吧湖北大学吧​zhuanlan.zhihu.com 仔细想…