如何使用C++中的Hashmap在任意随机数组中找到所有求和为特定值的对
How to find all the pairs that sum up to a certain values in any random array using Hashmap in C++
我想使用Hashmap找到数组中总和为某个数字X的所有对。我知道O(n^2)复杂度的基本解决方案,但在我读到的某个地方,哈希图可以提供O(n)解决方案。我不知道如何使用hashmap来实现解决方案。有人能给我一个如何做到这一点的伪代码吗?
如果使用类似std::set
的东西,那么集合中的所有值都是唯一的。这将允许您循环遍历集合,并从所需值中减去,以确定您需要的其他值。然后,您可以测试该值是否存在于集合中。操作如下:
- 将迭代器设置为集合中的第一个元素
- 获取集合中第一个元素的值
- 从所需值中减去该值以获得所需值
- 测试集合以查看所需的值是否在集合中
- 如果是,则记录两个值
- 递增迭代器并从#2开始重复,直到到达集合的末尾
目前,我假设您并不真正关心包含所有可能重复的相同结果。如果输入中的所有项目都是SUM/2,则您有N个2结果(全部相同)。
基本思想很简单:将所有数据插入到地图中。然后,对于哈希映射中的每个项目N
,查找sum-N
,如果存在,则打印出该对。
从实际的角度来看,如果输入的大小不是很大,那么使用O(N log N)解决方案可能会更好。首先对输入进行排序。然后从排序数据的开始和结束处开始遍历。从第一项和最后一项开始。如果总和太大,从末尾向后走,直到得到小于或等于所需总和的结果。如果相等,打印出这对。无论哪种方式,都可以增加起始指针并继续搜索。继续,直到两个指针相遇。
由于这主要是线性访问内存,因此它往往对缓存非常友好。访问哈希表中的数据往往具有较差的引用局部性,因此即使每次访问都具有恒定(预期)的复杂性,所涉及的常数也可能足够高,使得O(N log N)版本在实践中可能更快。
相关文章:
- 正在寻找C++不可变的hashset/hashmap
- 求和 int 乘以双倍时的欠/过近似
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 递归求和任务的错误答案
- 向量值(字符串和整数)求和C++
- 通过 RCPP 中的索引求和
- 矩阵行求和与 RowMajor 和 ColMajor 数据排列的奇怪性能差异
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 如何使用循环对所有数字求和?
- 循环中的线程 Runnin 用于对 c++ 中的数字求和
- 使用动态数组求和和和求平均值
- 找到所有与自己求和的数字X的快速方法,去掉一个数字得到N
- 如何对堆栈中的所有项目求和?Postfix计算器
- MPI 归约操作中的求和顺序
- 在高通六边形处理器的word32上执行水平求和的最快方法是什么
- 模板化求和(参数...)可变参数函数无法编译
- 平衡数组索引,同时从左和右对数组求和
- g++ 6.3,avx 内联函数上的 Kahan 求和用易失性关键字进行序列化
- 简单的计数和求和函数没有按照我预期的方式工作
- 如何使用C++中的Hashmap在任意随机数组中找到所有求和为特定值的对