首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用长度不同的向量索引的双三重for循环

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

Stack Overflow用户
提问于 2019-11-21 03:06:29
回答 1查看 186关注 0票数 0

我在这上面花了太多的时间寻找文档或足够的例子,但都无济于事。好心的人告诉我如何处理这个问题。

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

代码语言:javascript
复制
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)中。

代码语言:javascript
复制
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条件。我还阅读了这篇文章,其中包括状态循环可以是原子变量,也可以是相同长度的向量。然而,语言是不可能如此有限的。任何人可以教育我或与我分享的链接,很容易遵循…

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-21 16:46:58

如果我没理解错的话,您想知道在每个时间窗口内有多少订单处于活动状态(也就是重叠)?如果是这样,那么您可以像这样实现它:

代码语言:javascript
复制
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,您必须避免这些概念。

编辑-基于注释的附加方法。

代码语言:javascript
复制
/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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58961648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档