这个问题涉及C ++。
假设我有1000万条数据记录,每条数据都是一个6位数字,我输入的数字需要与这些数据匹配。
归结为两个问题:
我正在寻找性能比什么都重要,内存使用不是问题。我正在研究哈希函数,但我不确定这是否是我应该寻找的。 p>
答案 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?搜索必须是最快的之一。