您的位置:首页 > 其它

vector数据查找方法

2016-02-05 13:38 471 查看
用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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: