C ++搜索功能

时间:2011-07-29 14:27:33

标签: c++

这个问题涉及C ++。

假设我有1000万条数据记录,每条数据都是一个6位数字,我输入的数字需要与这些数据匹配。

归结为两个问题:

  1. 存储此数据的最佳方法是什么?数组?
  2. 搜索或匹配此数据的最佳方式是什么?
  3. 我正在寻找性能比什么都重要,内存使用不是问题。我正在研究哈希函数,但我不确定这是否是我应该寻找的。

4 个答案:

答案 0 :(得分:4)

对于快速查找,基本上有两个选项:std::map,其具有O(log n)查找,或std::unordered_map,其具有预期的O(1)查找(但可能更糟)。

如果您的密钥类型实际上是一个整数(根据情况就是这种情况),您可以免费获得完美的散列,因此无需额外的成本即可获得无序映射,因此我会尝试使用它。

但是只需创建一个typedef并尝试两者并进行比较!

#include <map>
#include <unordered_map>

typedef unsigned int key_type;  // fine, has < , ==, and std::hash

typedef std::map<key_type, some_value_type> my_map;
// typedef std::unordered_map<key_type, some_value_type> my_map;

my_map m;  // populate

my_map::const_iterator it = m.find(<some random key>);

如果您实际上不需要将任何数据与键相关联,即如果您不需要值类型,则将“map”替换为“set”。如果您需要具有相同键的多个记录,请将“map”替换为“multimap”。

答案 1 :(得分:2)

只需要查找一个6位数的数字,就可以保留一个包含100万个元素的数组并直接进行查找。

答案 2 :(得分:0)

如果你知道你将拥有多少条记录,你可以预先将一个数组分配到该大小,然后开始存储数据。否则,一些其他数据结构(如矢量)会更好。

要进行搜索,请使用二进制搜索。它将大大减少您的搜索时间。

基本上会发生什么......(数据需要按btw排序)..

您将跳转到数据结构的中间元素,看看您的输入是高还是低。如果它更高,则转到结构的上半部分并递归地重复此过程。如果它较低,则转到下半部分并执行相同操作。在您找到匹配的数据之前,请执行此操作。

答案 3 :(得分:0)

假设内存不是问题,为什么不将数据存储到地图中或设置为STL?搜索必须是最快的之一。