You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:25:37