两种数据流的操作 - 设计算法

时间:2017-08-08 13:38:51

标签: algorithm

我已经多次看到这个算法问题或其变体但未找到或能够确定问题的最佳解决方案。问题是:

  

您将获得两个队列,其中每个队列包含{timestamp,price}   对。你必须打印"价格1,价格2"配对所有这些   时间戳,其中abs(ts1-ts2)< = 1秒,其中ts1和price1是   从第一个队列开始,ts2和price2来自第二个队列。

您如何设计系统来处理这些要求?

然后对这个问题进行跟进:如果其中一个队列比另一个队列慢(数据被延迟)该怎么办?你会怎么处理这个?

5 个答案:

答案 0 :(得分:0)

您可以通过与合并排序的合并算法类似的方式执行此操作,仅加倍。

我将描述一种算法,我选择队列#1作为我的“主队列”。这只会提供部分解决方案;我将解释如何在事后完成它。

您可以随时在内存中保留每个队列中的一个条目。每当两个条目你坚持你的条件不到一秒钟,打印出他们的价格。无论你是否这样做,你丢弃时间戳较低的那个并获得下一个。如果队列#1中的时间戳在任何时候都低于队列#2中的时间戳,则丢弃队列#1中的条目,直到不再是这种情况。如果它们都具有相同的时间戳,则将其打印出来并从队列#1中推进。重复直到完成。

这将打印出所有“price1price2”对,其ts1ts2对应0 <= ts1 - ts2 <= 1

现在,对于另一半,只做这一次,只选择队列#2作为你的“主队列”(即我只是用数字1和2反转做的所有事情) - 除了不打印对相同的时间戳,因为你已经在第一部分打印了那些。

这将打印出所有“price1price2”对,其ts1ts2支持0 < ts2 - ts1 <= 1,这就像说{ {1}}。

您可以同时获得0 > ts1 - ts2 >= -1所有案例的打印输出,即-1 <= ts1 - ts2 <= 1

答案 1 :(得分:0)

  1. 除了队列之外,还使用两个哈希映射(每个队列都独占一个队列)
  2. 一旦新项目到达,请删除秒数并将其用作相应散列映射的关键字。
  3. 使用完全相同的密钥,检索另一个散列图中的所有项目。
  4. 逐一比较实际检索到的项目是否在项目符号2中的项目1秒之外。
  5. 请注意,这将无法检测到分钟差异的项目:将无法检测到10:00:59和10:01:00。

    解决这个问题:

    • 对于像XX:XX:59这样的项目,您需要使用键XX:XX和XX:XX + 1两次点击哈希图。
    • 对于像XX:XX:00这样的项目,你需要使用键XX:XX和XX:XX-1两次点击哈希图。

    注意:添加日期(不是数学日期),因为它会自动处理01:59:59 + 1 = 02:00:00或周一1 23:59:59成为周二2 00:00之类的事情:00

    BTW,此算法还处理延迟问题。

答案 2 :(得分:0)

如果算法仅基于时间戳的比较,则队列的速度根本不重要。如果一个队列为空,并且您无法继续,只需定期检查,直到您可以继续。

您可以通过管理其中一个队列的列表来解决此问题。在下面的算法中,选择了第一个,因此它被称为l1。它就像一个滑动窗口。

  1. 将第二个队列排队:d2。

  2. 虽然l1的头部的时间戳小于d2的时间戳,但差值大于1:从l1中移除头部。

  3. 浏览列表并打印所有对l1 [i] .price,d2.price,只要时间戳的差异小于1.如果没有到达列表的末尾,继续第1步。

  4. 从第一个队列中获取下一个元素并将其添加到列表中。如果时间戳之间的差异小于1,则打印价格并重复,如果不继续步骤1。

答案 3 :(得分:-1)

这是我的解决方案,您需要以下服务。

  1. 设计服务以从Queue1读取消息并将数据推送到DB
  2. 设计另一项服务以从Queue2读取消息并将数据推送到同一个数据库。
  3. 设计另一项服务以从DB读取数据,并根据所需结果的频率打印结果。
  4. 修改  以上指定系统的设计,请记住以下要点

    Scalablity - 如果系统负载增加,服务数量可以扩大

    缓慢已经提到一个队列比其他队员慢,很有可能,第一个队列接收更多消息然后第二个,因此无法产生所需的输出。

    Otput Frequencey 将来如果需求发生变化而不是1秒差异我们想要显示1小时的差异,那么它也是非常有可能的。

答案 4 :(得分:-1)

从两个队列中获取第一个元素。

比较时间戳。如果在一秒钟内输出该对。

从提供早期时间戳的队列中,获取下一个元素。

重复。

编辑:

在@ maraca的评论之后,我不得不重新考虑我的算法。是的,如果在两个队列中一秒钟内有多个事件,它将不会产生所有组合。