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是一种在C++中常用的数据结构,它是一种动态数组,可以根据需要自动扩展和收缩。通过引用中的代码,我们可以看到Vector的几种声明方法: 1. 使用默认构造函数创建一个空的Vector:`vector<int> vec;` 2. 使用已存在的Vector来初始化一个新的Vector:`vector<int> vec1(vec);` 3. 创建一个含有n个数据Vector:`vector<int> vec2(n);` 4. 创建一个含有10个数据且全部初始化为0的Vector:`vector<int> vec3(10, 0);` 除了一维数组,Vector还可以用来表示二维数组。通过引用中的代码,我们可以看到如何创建m行n列的二维数组: 1. 首先创建一个大小为m的Vector:`vector<vector<int>> array(m);` 2. 然后为每一行创建一个大小为n的Vector:`array[i].resize(n);` 3. 最后使用嵌套的for循环遍历数组,并给每个元素赋值:`array[i][j] = (i + 1) * (j + 1);` 除了基本的操作,Vector还可以定义特殊的存储类型。通过引用中的代码,我们可以看到一个自定义的结构体Rect,并将其作为Vector的元素进行存储。在结构体内部,我们可以重载operator<函数来定义元素的比较规则。 总之,Vector是一个非常常用的数据结构,可以灵活地存储和操作数据。它提供了丰富的接口,使得我们可以方便地进行元素的插入、删除、查找等操作。如果想要深入了解Vector的更多功能和用法,可以参考引用中提到的邓俊辉老师的数据结构课程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值