Warm tip: This article is reproduced from serverfault.com, please click

data structures-处理交易清单的算法

(data structures - Algorithms to process a list of transactions)

发布于 2020-12-21 04:51:20

这是我在为贸易/付款服务公司进行SWE实习OA时通常遇到的一种类型的问题:给定形式为“操作-客户ID-交易ID-金额”的交易列表,我们需要对其进行处理并返回采取的行动清单或剩余金额。

这是一个具体的例子。输入是一个字符串列表,格式为“动作订单ID-价格-金额-买/卖”,仅包含两个动作SUB(提交)和CXL(取消)。

  • 对于买入,较高的价格具有较高的优先级,而对于出售,较低的价格具有较高的优先级。如果对于相同的“购买”或“出售”类别,价格相似,则较早输入的字符串具有更高的优先级。
  • 如果买入价格> =卖出价格,则两个订单匹配,金额=最小值(卖出数量,买入数量),买入或卖出将相应地决定。
  • 如果已经完成订单,则不会取消该订单。
  • 如果CXL操作中的“订单ID”不存在,则将无效(无错误)。

要求我们返回要执行的操作的列表,输出应该是具有以下格式的字符串列表:“订单ID-买入/卖出-买入/卖出金额”

输入和输出示例:

输入:[“ SUB-hghg-10-400-B”,“ SUB-abab-15-500-B”,“ SUB-abcd-10-400-S”]

输出:[“ abcd-S-400”]

说明:“ abab”的买入价比“ hghg”高,尽管后来出现了,所以将首先对其进行处理。abab的数量= 500,abcd的数量= 400 =>数量= 400

输入:[“ SUB-hghg-10-400-B”,“ CXL-hghg”]

输出: []

说明:不执行任何操作,因为订单在执行之前已被取消。

我已经尝试使用哈希映射来解决问题,但是对我来说它变得太复杂了。以前,我也遇到过类似的问题,但是不同之处在于,Cancel将删除订单,而不管其是否已填写,在这种情况下,我使用LinkedList来跟踪订单。

我想问一下是否有任何通用方法可以最佳地解决这类问题。我在LeetCode上徘徊了一段时间,练习了一些中级问题,但是还没有遇到这种问题类型。如果有任何典型的数据结构可以有效地存储每个订单的信息,我也想知道。我还在互联网上搜索了一些关键字,例如算法交易,用于处理付款/交易的算法,但我还没有发现任何有用的东西。任何帮助是极大的赞赏!

非常感谢你阅读我冗长的帖子。

Questioner
Quỳnh Chi
Viewed
0
lex82 2020-12-22 02:40:25

因此,你的输入是一系列已提交的订单和取消的订单,而你的输出是订单匹配时发生的一系列交易,对吗?

我将按以下方式解决该问题:创建一个订单簿数据结构,该结构包含所有未平价交易,单独购买和出售,按价格排序的交易。

初始化:订单簿当然被初始化为空。初始化你产生的空交易清单。

循环:然后一个接一个地处理传入的请求(提交或取消),并将其应用于订单簿。这将把订单添加到书中,或者该订单与一个或多个其他订单匹配,从而产生新的交易。将产生的交易追加到你的交易清单中。

基本上就是这样。但是,请注意,将新订单与这本书匹配并不是一件容易的事。书中的一个订单可能仅部分匹配并保留在书中,否则新订单将仅部分匹配,其余金额必须添加到书中。我建议你为单个步骤编写单元测试,以确保你的订单已按预期进行排序和匹配。