【问题标题】:Efficient algorithm to search sets of data搜索数据集的高效算法
【发布时间】:2012-08-01 17:24:13
【问题描述】:

给定几组元素,例如:

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 个元素)。

后续问题,我将在 C++ 中实现它,因此我有兴趣了解任何推荐的算法,无论它们是否存在于开源 C++ 库(最好是 STL、Boost 或 QT,但我'也会考虑其他人)。

【问题讨论】:

    标签: c++ algorithm search


    【解决方案1】:

    如果顺序很重要,您关注的是序列,而不是集合。术语很重要。

    由于您只考虑大约 1,000 个序列,因此将它们存储在哈希表中应该很容易,并且性能良好。我会考虑构建一个字符串来表示每个序列,例如,通过连接每个元素的字符串表示形式,加上某种分隔符,然后对其进行哈希处理。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢。由于我正在处理容器的容器,它会以有效的方式比较内部容器(例如,如果第一个元素不匹配,则停止比较给定的集合),还是会比较整个内部容器以找到匹配项?
      • 序列容器的operator< 重载按顺序比较元素。他们只会比较需要比较的尽可能多的元素以确定结果(比较不必要的元素是没有意义的)。另请注意,以这样一种方式封装此逻辑是微不足道的,即换出不同的存储实现(例如std::unordered_set)将很简单。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在这种情况下,我会使用哈希表。您将拥有O(1) 的访问时间(最坏的情况是O(n),但使用良好的哈希函数这不是问题)

        因此,如果您的 Hashtabel 足够大并且您不必担心空间问题,这绝对是最快的搜索方式。 (考虑二分搜索在O(log(n))

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-28
          • 1970-01-01
          • 1970-01-01
          • 2021-12-17
          • 1970-01-01
          • 2023-03-08
          相关资源
          最近更新 更多