vector数据查找方法
2016-02-05 13:38
471 查看
用STL编敲代码时常常使用vector容器来存储数据。当容器中的数据有序时我们能够採取两种方式:
(1) 利用<algorithm>中的find函数进行查找;
(2) 折半查找。
另外也能够将数据存入hash_map中进行查找,以下来測试比較这两种方法的时间效率。
令数组A存储2~99999之间的全部数。则生成素数的方式
(1) 找到当前最小的数字min;
(2) 然后删除min的全部倍数。
反复这两个过程直到A中全部的数字处理完成,即找到了2~99999之间的全部素数。
当数字添加到999999时,折半耗时63ms,hash_map耗时31ms。
当数字添加到9999999时,折半耗时577ms,hash_map耗时499ms。
注:hash_map中无法初始化桶的个数会减少hash的速度。
(欢迎大家告知怎样初始化)
折半查找仅仅能用于有序的数据的查找,而find无要求。
(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; }
相关文章推荐
- 网关跳转 银联支付问题和注意事项
- VC6修改lib文件的输出路径
- 计算机知识扫盲
- 只有五行的Floyd最短路径算法
- usaco 3.3 game1 2008.11.7
- hdu1247 Hat’s Words
- usaco 3.3 fence 2008.11.7
- android在eclipse中打包(签名包)方法及常见问题解决
- ExInitializeResourceLite routine
- 所悟2
- vijos-p1158 2008.11.6
- vijos-p1331 2008.11.6
- 【COCOS CREATOR 系列教程之四】基于0.7.1先简单制作一个PAGEVIEW
- [dp优化]个人对dp优化的理解
- mysql sql语句大全
- vijos-p1128 2008.11.6
- Codeforces Round #311 (Div. 2) E - Ann and Half-Palindrome(字典树+dp)
- 《时间序列分析及应用:R语言》读书笔记--第二章 基本概念
- 完成blog后台一枚
- hdu acm 1507 Uncle Tom's Inherited Land*