求基于kdb的目标和数对查找向量式编程解决方案(附Java实现)
目标和数对查找的KDB向量式实现方案
问题背景
已通过Java的HashMap容器实现目标和数对查找,但无法基于向量式编程完成KDB版本开发,现提供对应解决方案。
Java实现参考
Java代码
import java.util.HashMap; import java.util.Map; public class FindAllPairsOfTargetSum { public static void main(String[] args) { int arr[] = { 8, 7, 2, 5, 3, 1 }; FindAllPairsOfTargetSum.findPairs(arr,10); } public static void findPairs(int arr[], int sum){ Map<Integer, Integer> map = new HashMap<Integer,Integer>(); for (int i = 0; i<arr.length;i++){ if(map.containsKey(sum - arr[i])){ System.out.println(" Pair is found : ("+arr[map.get(sum-arr[i])]+": "+(arr[i])+" )"); }else{ map.put(arr[i], i); } } } }
运行结果
Pair is found : (8: 2 )
Pair is found : (7: 3 )
KDB向量式实现方案
KDB的向量式编程避免了循环,利用内置函数和数组操作高效完成任务,核心思路是通过补数匹配+索引过滤来找到符合条件的数对:
实现代码
arr: 8 7 2 5 3 1; target: 10; // 计算每个元素对应的补数 complements: target - arr; // 找到每个补数在原数组中出现的位置,且位置小于当前元素的索引 matches: {where x in arr} each complements; validIndices: where each matches < til count arr; // 提取有效数对 pairs: flip (arr each matches . validIndices; arr where each validIndices); // 输出结果 {println["Pair is found : (", string[x], ": ", string[y], " )"]} each pairs
代码解释
- 补数计算:
complements: target - arr生成每个元素对应的目标补数数组,此处得到2 3 8 5 7 9。 - 匹配位置查找:
{where x in arr} each complements为每个补数找出在原数组中的所有索引位置。 - 索引过滤:
validIndices: where each matches < til count arr筛选出补数索引小于当前元素索引的情况,避免重复输出如(2,8)这类反向数对。 - 数对提取:通过数组操作提取符合条件的数对,最后循环输出结果。
运行结果
Pair is found : (8: 2 ) Pair is found : (7: 3 )
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

