我在这上面花了太多的时间寻找文档或足够的例子,但都无济于事。好心的人告诉我如何处理这个问题。
假设我有一个购买股票的订单表。他们将在指定的时间结束。
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)出于某些原因,我希望在开始和结束之间的给定时间范围内找到在子时间间隔内有效的最大订单数(假设没有事务处理)。这是测试OOP实现技能的一个非常典型的问题……要在if-else条件下排序并减去/相加,时间与序列中的开始时间匹配,在O(nlogn)中。
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条件。我还阅读了这篇文章,其中包括状态循环可以是原子变量,也可以是相同长度的向量。然而,语言是不可能如此有限的。任何人可以教育我或与我分享的链接,很容易遵循…
发布于 2019-11-21 16:46:58
如果我没理解错的话,您想知道在每个时间窗口内有多少订单处于活动状态(也就是重叠)?如果是这样,那么您可以像这样实现它:
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您没有找到很多关于循环/索引/迭代的文档或示例的原因是因为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!,,50https://stackoverflow.com/questions/58961648
复制相似问题