搜索数据集的高效算法

时间:2012-08-01 17:24:13

标签: c++ algorithm search

给出几组元素,例如:

int set1[5] {5601, 935, 4153, 2195, 422};
int set2[5] {5601, 935, 23, 44, 422};
int set3[5] {4205, 935, 4153, 2195, 15};
int set4[5] {4205, 589, 4015, 44, 422};

如果顺序很重要(即1,2,3与2,1,3不同),找到特定集合的有效算法是什么?例如,您想找到:

int value[5] {5601, 935, 23, 44, 422};

考虑:

  1. 新集的插入成本不是问题,因此可以将它们存储在任何数据结构中,以优化搜索时间。

  2. 这些集合将包含每个介于1到1,000,000个元素之间的任何位置(大约,并且将有1到1000个集合之间的任何位置(同样,大约)。但是对于任何给定集合,元素的数量将始终相同集合(例如,如果一个集合有10个元素,那么所有集合将有10个元素)。

  3. 后续问题,我将在C ++中实现这一点,所以我有兴趣找出任何推荐的算法,它们是否存在于开源C ++库中(最好是STL,Boost或QT,但我我也会考虑其他人。

4 个答案:

答案 0 :(得分:5)

如果订单很重要,那么您正在查看序列,而不是集合。术语很重要。

由于您只考虑了大约1,000个序列,因此将它们存储在具有良好性能的哈希表中应该很容易。我会考虑构造一个字符串来表示每个序列,例如,通过连接每个元素的字符串表示形式,加上某种分隔符,以及散列它。

答案 1 :(得分:4)

使用std::vector<set_type>存储集合。将所有集合插入容器中。使用std::sort对容器进行排序。如果需要元素的迭代器,请使用std::binary_search(或std::lower_bound)查找元素。

用于set_type的类型取决于每个集合中的元素数量。如果已知元素的数量很少,那么std::array<T, N>就足够了;否则,请考虑std::vector<T>

答案 2 :(得分:0)

定义集合的顺序,然后将它们插入树中。或者定义哈希码和比较器并对它们进行哈希处理。

答案 3 :(得分:0)

在这种情况下,我会使用Hashtable。你可以在O(1)的某些时间访问时间(最坏的情况是O(n)但是有一个好的Hashfunction这不是问题)

因此,如果您的Hashtabel足够大并且您不必担心空间,那肯定是最快的搜索方式。 (考虑二进制搜索在O(log(n))

哈希表仅在新的C ++ 0x标准的STL中可用。见STL::TR1