使用长度不同的向量索引的双 - 三重 for 循环

double - triple for loops using index of vectors that vary in length

我花了太多时间搜索文档或足够的示例,但无济于事。 请教我如何处理这个问题。

假设我有以下 table 个购买股票的订单。他们将在指定时间结束。

orders:([] seq:10*1+til 5; ID:5#`softbank;start:11:00 10:00 09:00 13:30 18:00;end:13:30 12:30 11:30 14:30 19:00)

出于某种原因,我希望在给定的开始和结束时间范围内的子时间间隔内找到最大有效订单数(比如 none 已交易)。这是一道非常典型的考验OOP实现技巧的题...在O(nlogn)的序列中,在时间与开始时间匹配的if-else条件下进行排序和减法/加法。

id 10: 3 (11-11:30 3, 11:30 -12 2(id 10/30), 12-12:30 2(id 10/20), 12:30 - 13:30 1) 
id 20: 2 (10-11 2 (id 20/30), 11-11:30 3 (id 10,20,30), 11:30-12:30 2 (id 10/20)
id 30: 2 (9-10 1, 10-11:30 2)
id 40: 1
id 50: 1

我只能考虑迭代start/end的两个循环,里面有if条件。我还阅读了其中声明循环可以使用原子变量或相同长度的向量的文章。语言不可能如此有限。任何人都可以教育我或与我分享 link 很容易理解...

如果我对问题的理解正确,您是想找出每次 window 内有多少订单处于活动状态(也称为重叠)?如果是这样,那么您可以这样实现:

orders:([] seq:10*1+til 5; ID:5#`softbank;start:11:00 10:00 09:00 13:30 18:00;end:13:30 12:30 11:30 14:30 19:00);

/to get the count
q)update active:sum each (start<\:end)&end>\:start from orders
seq ID       start end   active
-------------------------------
10  softbank 11:00 13:30 3
20  softbank 10:00 12:30 3
30  softbank 09:00 11:30 3
40  softbank 13:30 14:30 1
50  softbank 18:00 19:00 1

/to get the seq numbers
q)update active:seq where each (start<\:end)&end>\:start from orders
seq ID       start end   active
---------------------------------
10  softbank 11:00 13:30 10 20 30
20  softbank 10:00 12:30 10 20 30
30  softbank 09:00 11:30 10 20 30
40  softbank 13:30 14:30 ,40
50  softbank 18:00 19:00 ,50

您没有在 loops/indices/iteration 上找到太多文档或示例的原因是 kdb 不是为该方法设计的。要想用好kdb你得避开这些概念

编辑 - 基于评论的其他方法。

/intervals
iv:distinct asc raze orders`start`end;

/overlaps
update o:{1_{y,x}prior iv where(iv>=x)&iv<=y}'[start;end] from `orders;

/intersections
q)update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
-------------------------------------------------------------------------------------
10  softbank 11:00 13:30 (11:00 11:30;11:30 12:30;12:30 13:30)!(10 20 30;10 20;,10)
20  softbank 10:00 12:30 (10:00 11:00;11:00 11:30;11:30 12:30)!(20 30;10 20 30;10 20)
30  softbank 09:00 11:30 (09:00 10:00;10:00 11:00;11:00 11:30)!(,30;20 30;10 20 30)
40  softbank 13:30 14:30 ,13:30 14:30!,,40
50  softbank 18:00 19:00 ,18:00 19:00!,,50

/if you want to know the counts
q)@[;`o;count'']update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
--------------------------------------------------------------------
10  softbank 11:00 13:30 (11:00 11:30;11:30 12:30;12:30 13:30)!3 2 1
20  softbank 10:00 12:30 (10:00 11:00;11:00 11:30;11:30 12:30)!2 3 2
30  softbank 09:00 11:30 (09:00 10:00;10:00 11:00;11:00 11:30)!1 2 3
40  softbank 13:30 14:30 ,13:30 14:30!,1
50  softbank 18:00 19:00 ,18:00 19:00!,1

/if you want to see where the maximum overlap occurred
q)@[;`o;{#[;x]where c=max c:count each x}']update o:o#\:{u[`seq]group(u:ungroup[x])`o}orders from orders
seq ID       start end   o
-----------------------------------------------
10  softbank 11:00 13:30 ,11:00 11:30!,10 20 30
20  softbank 10:00 12:30 ,11:00 11:30!,10 20 30
30  softbank 09:00 11:30 ,11:00 11:30!,10 20 30
40  softbank 13:30 14:30 ,13:30 14:30!,,40
50  softbank 18:00 19:00 ,18:00 19:00!,,50