微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

KDB/Q 如何高效实现移动排名?

如何解决KDB/Q 如何高效实现移动排名?

我正在尝试实现一个移动排名函数,参数为 n(项目数)和 m(列名)。这是我的实现方式:

mwindow: k){[y;x]$[y>0;x@(!#x)+\:!y;x@(!#x)+\:(!-y)+y+1]};

mrank: {[n;x] sum each x > prev mwindow[neg n;x]};

但是如果 n 适中,比如 100,这似乎需要相当长的时间。 我想这是因为它必须从头开始计算,不像 msum 保持一个运行变量并且只计算新添加删除间的差异。

解决方法

这里有许多通用的滑动窗口函数,您可以使用它们来生成滚动列表以应用您的排名:https://code.kx.com/q/kb/programming-idioms/#how-do-i-apply-a-function-to-a-sequence-sliding-window

这些方法似乎用零/空值填充列表,但是我认为这并不适合您对 rank 的使用。这是另一种可能更适合 rank 的可能方法(尽管我尚未对其进行大规模性能测试):

q)mwin:{x each (),/:{neg[x]sublist y,z}[y]\[z]}
q)update r:mwin[rank;4;c] from ([]c:10?100)
c  r
----------
84,0
25 1 0
31 2 0 1
0  3 1 2 0
51 1 2 0 3
29 2 0 3 1
25 0 3 2 1
73 2 1 0 3
0  2 1 3 0
6  2 3 0 1
q)update r:last each mwin[rank;4;c] from ([]c:10?100)
c  r
----
38 0
72 1
13 0
77 3
64 1
9  0
37 1
79 3
97 3
63 1
q)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?