我见过这个算法问题或它的变种好几次,但还没有找到或能够确定问题的最佳解决方案。问题是:
给您两个队列,每个队列包含{timestamp,price}
一对。你必须打印“价格1,价格2”对所有这些
时间戳,其中abs(ts1-ts2)第一个队列中的ts2和price2来自第二个队列。
如何设计一个系统来处理这些需求?
接下来是一个问题:如果其中一个队列比另一个慢(数据被延迟),该怎么办?你会怎么处理?
最佳答案
您可以以与合并排序中的合并算法相似的方式执行此操作,仅需加倍。
我将描述一个算法,在这个算法中,我选择queue 1作为我的“主队列”,这只会提供一个部分的解决方案,我将在后面解释如何完成它。
在任何时候,您都会在内存中为每个队列保留一个条目。无论何时,只要你坚持两个条目之间的间隔小于1秒,就打印出它们的价格不管你是否这样做了,你丢弃一个较低的时间戳,并得到下一个。如果在任何时候,队列1的时间戳低于队列2的时间戳,则丢弃队列1中的条目,直到不再是这样。如果它们都有相同的时间戳,则将其打印出来并将队列1中的时间戳提前。重复直到完成。
这将打印出所有的“price1
,price2
”对,它们对应的ts1
和ts2
支持0 <= ts1 - ts2 <= 1
。
现在,对于另一半,只做同样的事情,这次选择queue#2作为你的“主队列”(也就是说,把我刚才说的数字1和2颠倒过来)除了不要打印出具有相同时间戳的对,因为你已经在第一部分中打印了那些。
这将打印出所有的“price1
,price2
”对,它们对应的ts1
和ts2
支持0 < ts2 - ts1 <= 1
,就像说0 > ts1 - ts2 >= -1
。
一起打印出-1 <= ts1 - ts2 <= 1
的所有情况,即abs(ts1 - ts2) <= 1
的所有情况。
关于algorithm - 两个数据流上的运算-设计算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45569947/