vector数据查找方法
用STL编敲代码时常常使用vector容器来存储数据。当容器中的数据有序时我们能够採取两种方式:
(1) 利用<algorithm>中的find函数进行查找;
(2) 折半查找。
另外也能够将数据存入hash_map中进行查找,以下来測试比較这两种方法的时间效率。
1. 測试数据集
生成比99999小的全部素数作为查询数据集,查找2到99999之间的全部数。
令数组A存储2~99999之间的全部数。则生成素数的方式
(1) 找到当前最小的数字min;
(2) 然后删除min的全部倍数。
反复这两个过程直到A中全部的数字处理完成,即找到了2~99999之间的全部素数。
2. 效率比較
利用find函数查找须要2745ms,利用折半与hash_map均仅仅须要0ms。
当数字添加到999999时,折半耗时63ms,hash_map耗时31ms。
当数字添加到9999999时,折半耗时577ms,hash_map耗时499ms。
注:hash_map中无法初始化桶的个数会减少hash的速度。
(欢迎大家告知怎样初始化)
3. 分析
实际遇到的问题:在处理大规模图数据的过程中遇到了vector能存储全然部的图数据,而hash_map却不能。即vector存储的数据规模比hash_map大。
折半查找仅仅能用于有序的数据的查找,而find无要求。
4. 參考代码
#include <string>
#include <sstream>
#include <time.h>
#include <algorithm>
#include <vector>
#include <iostream>
#include <hash_map>
using namespace std; class compare
{
vector<int> dataVector;
vector<int> findData;
hash_map<int, int> dataHash;
public:
compare();
~compare(void);
void generalPrime();
void findTest();
void binSearch();
void hashTest();
}; compare::compare()
{
generalPrime();
} compare::~compare(void)
{
findData.clear();
dataVector.clear();
} void compare::findTest()
{
clock_t startTime = clock();
vector<int>::iterator result;
int exist = 0;
for (vector<int>::iterator it = findData.begin(); it < findData.end(); it++)
{
result = find(dataVector.begin(), dataVector.end(), *it);
if (result != dataVector.end())
{
//查找成功
exist++;
}
}
clock_t endTime = clock();
cout << "exist num: " << exist << " find time " << (double)(endTime - startTime)/CLOCKS_PER_SEC*1000 << "ms" <<endl;
} void compare::binSearch()
{
int start;
int end;
int middle;
int exist = 0;
clock_t startTime = clock();
for (vector<int>::iterator it = findData.begin(); it < findData.end(); it++)
{
start = 0;
end = dataVector.size() - 1;
middle = (start + end) / 2;
while (start <= end)
{
if (*it < dataVector[middle])
{
end = middle - 1;
}
else if (*it > dataVector[middle])
{
start = middle + 1;
}
else
{
break;
}
middle = (start + end) / 2;
}
if (start <= end)
{
exist++;
}
}
clock_t endTime = clock();
cout << "exist num: " << exist << " binsearch time: " << (double)(endTime - startTime)/CLOCKS_PER_SEC * 1000 << "ms" << endl;
} void compare::generalPrime()
{
int maxPrime = 99999;
int flag;
vector<bool> visited(maxPrime, true);
for (int i = 2; i < maxPrime; ++i)
{
findData.push_back(i);
if (visited[i])
{
dataVector.push_back(i);
dataHash[i] = 1;
flag = i;
for (int ii = 2, flag = i * ii; flag < maxPrime; ++ii, flag *= ii)
{
visited[flag] = false;
}
}
}
} void compare::hashTest()
{
clock_t startTime = clock();
int exist = 0;
vector<int>::iterator result;
for (vector<int>::iterator it = findData.begin(); it < findData.end(); it++)
{
if (dataHash.find(*it) != dataHash.end())
{
exist++;
}
}
clock_t endTime = clock();
cout << "exist num: " << exist << " hash time " << (double)(endTime - startTime)/CLOCKS_PER_SEC*1000 << "ms" << endl;
}
int main()
{
compare com;
com.findTest();
com.binSearch();
com.hashTest();
return 1;
}
vector数据查找方法的更多相关文章
- Oracle索引梳理系列(一)- Oracle访问数据的方法
版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...
- STM32 使用 printf 发送数据配置方法 -- 串口 UART, JTAG SWO, JLINK RTT
STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) http://home.eeworld.com.cn/my/space-uid-338727-blogid-47 ...
- sap 三代出口(BADI)的查找方法
sap 三代出口(BADI)的查找方法 对于根据事务代码查找对应的BADI,网上介绍的方法很多,但总结下来无非就两种方法,在此把它记录下来,方便以后自己查阅了.(1)通过SE24,输入CL_EXITH ...
- 恢复oracle数据库误删除数据的方法汇总
学习数据库时,我们只是以学习的态度,考虑如何使用数据库命令语句,并未想过工作中,如果误操作一下,都可能导致无可挽回的损失.当我在工作中真正遇到这些问题时,我开始寻找答案.今天主要以oracle数据库为 ...
- 最全的iOS数据存储方法
目的 项目准备运用的Core Data进行本地数据存储,本来打算只写一下Core Data的,不过既然说到了数据存储,干脆来个数据存储基础大总结!本文将对以下几个模块进行叙述. 沙盒 Plist Pr ...
- MongoDB学习(查找文档和其他数据查找操作)
理解Cursor对象和查询运算符 cursor对象 cursor对象相当于一个指针,可通过迭代它来访问MongdoDB数据库中的一组对象. 在使用 find() 方法查询时,返回的并非实际文档,而是一 ...
- pytorch:EDSR 生成训练数据的方法
Pytorch:EDSR 生成训练数据的方法 引言 Winter is coming 正文 pytorch提供的DataLoader 是用来包装你的数据的工具. 所以你要将自己的 (numpy arr ...
- Java集合系列(二):ArrayList、LinkedList、Vector的使用方法及区别
本篇博客主要讲解List接口的三个实现类ArrayList.LinkedList.Vector的使用方法以及三者之间的区别. 1. ArrayList使用 ArrayList是List接口最常用的实现 ...
- C#调试程序——断点+几种观察数据的方法
目录 C#调试程序--断点+观察数据的方法 1.写本文的背景 2.调试与测试 3.断点调试 3.1 F10 3.2 F11 3.3 SHIFT+F11 4.监视 4.1 按照1方法打断点,单步调试. ...
随机推荐
- Hibernate总结(二)---hibernate中的各种映射
知识的准备: (参考:汤阳光Hibernate3.6(基础)) 一.浅谈javaBean之间的关系 存在的关系: 1.关联(一对一.一对多.多对一.多对多) 2.聚合/组合(最后考虑) 3.继承 所以 ...
- 网络技术教程笔记(18)常见广域网技术——X.25与郑中基技术(←_←搜狗输入法你够了)
广域网与接入网技术 广域网与接入网技术 常见广域网技术--X.25 产生背景 尽管在当时,苹果二代计算机已经取得了很大的成功,但是PC和工作站却没有流行,也没有获得很多的网络支持,大多数人还是使用便宜 ...
- Latex beamer
使用明体(gbsn)和楷体(gkai)两种字型.以下的编程是一开始的宣告,并自动生成第一张封面投影片. \documentclass[cjk]{beamer}\usepackage{CJKutf8}\ ...
- 用python 10min手写一个简易的实时内存监控系统
简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...
- IOS UTI统一类型标识符:判断文件类型通过后缀
今天在学习文档和数据共享中,首先讲的处理统一类型标识符UTI.第一次见,所以记下来以备之用,首先了解UTI和MIME的概念 1.同一类型标识符(Uniform Type Identifier,UTI) ...
- 《Pointers On C》读书笔记(第一章 快速上手)
1.C语言是一种自由格式的程序设计语言,没有规则要求我们必须如何书写语句.然而,如果我们在编写程序时能够遵守一些约定还是非常值得的,它可以使代码更加容易阅读和修改.另外,预处理命令有较为严格的规则. ...
- Ceph相关博客、网站(256篇OpenStack博客)
官网文档: http://docs.ceph.com/docs/master/cephfs/ http://docs.ceph.com/docs/master/cephfs/createfs/ ( ...
- 使用Fiddler解析WCF RIA Service传输的数据
原文 http://www.cnblogs.com/wintersun/archive/2011/01/05/1926386.html 使用Fiddler 2 解析WCF RIA Service传输的 ...
- HDU 5059 Help him
题解:先判断第一个是否负号.如果是把第一个符号拿掉之后判断后面的长度是否<=12,并且是否数字,然后转化成数字看看是否在[a,b],注意-0这个数据. 如果不是判断长度是否<=12,并且是 ...
- Uber在华从沸点到冰点 搞定这些才能继续走下去
腾讯科技 蒋栩根 5月6日报道 五一前夕,本应坐等笑看小长假带来的喜人业绩的Uber被广州市工商.交委.公安部门的联合检查当头浇了一盆冷水,也被戴上了一顶“涉嫌非法运营”的帽子.而一天前,它才与广物汽 ...