如何使用C ++中的Hashmap查找在任意随机数组中总和到某个值的所有对

时间:2014-02-11 21:12:57

标签: c++ arrays hashmap sum

我想找到一个数组中使用Hashmap总计达到一定数量X的所有对。我知道具有O(n ^ 2)复杂度的基本解决方案但是在某处我读到了hashmap可以提供O(n)解决方案。我不知道如何使用hashmap来实现解决方案。有人能为我提供一个如何做到这一点的伪代码吗?

2 个答案:

答案 0 :(得分:1)

如果您使用类似std::set的内容,则该集合中的所有值都将是唯一的。这将允许您遍历集合并从所需值进行减法以确定您需要的其他值。然后,您可以测试以查看该值中是否存在该值。操作如下所示:

  1. 将迭代器设置为集合
  2. 中的第一个元素
  3. 获取集合
  4. 中第一个元素的值
  5. 从所需值中减去该值以获得所需的值
  6. 测试集合以查看所需的值是否在集合
  7. 如果记录两个值
  8. 递增迭代器并从#2开始重复,直到到达集合
  9. 的末尾

答案 1 :(得分:0)

目前,我将假设您并不真正关心包含所有可能重复的相同结果。如果输入中的所有项目都是SUM / 2,那么您有N 2 结果(全部相同)。

基本思路非常简单:将所有数据插入到地图中。然后,对于哈希映射中的每个项目N,查找sum-N,如果它存在,则打印出该对。

从实际的角度来看,如果输入的大小不是很大,那么使用O(N log N)解决方案可能会更好。首先对输入进行排序。然后从排序数据的开头和结尾开始走。您从第一个和最后一个项目开始。如果总和太大,则从末尾向后走,直到得到小于或等于所需总和的结果。如果相等,则打印出该对。无论哪种方式,您然后递增开始指针并继续搜索。继续,直到两个指针相遇。

由于这主要是线性访问内存,因此它往往非常缓存。访问哈希表中的数据往往具有更差的引用局部性,因此即使每个访问具有恒定(预期)的复杂性,所涉及的常数可能足够高以使O(N log N)版本在实践中可能更快。