求助:在Kdb中求解arr[j]>arr[i]时的最大j-i值(距离最大化问题)
解决Q语言中数组元素距离最大化问题
我们需要找到数组中满足arr[j] > arr[i]的最大j-i值,示例数组34 8 10 3 2 80 30 33 1的预期结果为6(对应索引i=1,j=7)。以下是几种可行的解决方案:
方法一:直接生成索引对筛选计算
这种方式逻辑直观,直接处理索引对而非元素值,避免重复元素的索引歧义:
// 定义目标数组 list: 34 8 10 3 2 80 30 33 1 // 生成所有i<j的索引组合 idxPairs: {(x,y) where x<y} cross til count list, til count list // 筛选符合arr[j]>arr[i]条件的索引对 validPairs: idxPairs where {list[y] > list[x]} each idxPairs // 计算所有有效对的距离,取最大值 maxDistance: max {y - x} each validPairs // 输出结果 maxDistance // 返回:6
方法二:扩展现有函数保留索引信息
如果你想沿用已编写的func逻辑,可以修改函数同时输出元素索引与值,后续直接计算距离:
list: 34 8 10 3 2 80 30 33 1 // 修改func,生成包含索引和对应值的配对 func: {[lst] ( (y; lst[y]) ) ,/: ( (y+1 + til count (y+1)_lst); (y+1)_lst ) } each til count lst // 展开所有生成的配对 r: raze func[list] // 筛选满足arr[j]>arr[i]的项 valid: r where {(x[1][1] > x[0][1])} each r // 计算每个有效项的索引差 distances: {x[1][0] - x[0][0]} each valid // 取最大距离 max distances // 返回:6
方法三:基于现有元素对反向获取索引
若不想修改现有func,可从已得到的元素对反向查找原数组中的索引(注意:此方法仅适用于数组无重复元素,或重复元素不影响结果的场景):
list: 34 8 10 3 2 80 30 33 1 func:{{first[y _ x],/: (y+1) _ x}[x] each y} // 获取满足条件的元素对 validPairs: asc r where {(x[1]>x[0])} each r:raze func[list;til count list] // 查找每个元素在原数组中的索引 indices: { (first where list=x[0]; first where list=x[1]) } each validPairs // 计算距离并取最大值 max {y - x} each indices // 返回:6
内容的提问来源于stack exchange,提问作者Rajasekhar
相关产品推荐
相关产品推荐

