假设您要实现一种以下列方式工作的算法:
您从包含表格值的文件中读入:
Mark Buy 20 1 100
Bob Sell 20 2 90
输入采用以下形式:
<name><buy or sell><quantity><time><company><buy maximum or sell minimum>
匹配买家和卖家的最快方式是什么(对于某些公司来说,只有当该公司购买量最高的人比该公司销售量最低的人时,才会匹配买家和卖家)。最顶层的买入或卖出将决定使用什么价格。
所以在给出的例子中我们有“马克,在第1时间,以2美元的价格从鲍勃那里以100美元的价格购买了20部Google。”
我们如何针对速度优化此算法?整个文件中的读数首先是最佳解决方案吗?
答案 0 :(得分:1)
您需要的是每种商品两个priority queues:一个用于有效购买出价(按最高价格划分优先顺序),一个用于有效卖出出价(按最低价格优先排序),另外还有一个用于创建出价的整体排队/到期事件(按时优先)。 (如果您的出价是如上所述的批处理文件,而不是因果/在线序列,您只需对创建/到期事件进行排序,但仍需要买卖队列)
使用优先级队列是关键;之后的一切都是管道:
foreach bid creation/expiry event, in chronological order:
if the event is an expiry:
delete the bid from the appropriate queue
else, the event is a creation:
add the bid to the appropriate queue
repeat until no further transaction can be performed:
find max-active-buy and min-active-sell bids for the given commodity
if they match:
execute (and record) the transaction
update partially fulfilled bids, and remove completely fulfilled ones
当作为批处理操作执行时,您可以通过整理每个单独的商品并分别执行每个商品来简化一些事情。但是,如果市场以任何方式进行互动(例如检查足够的账户余额),这将无效。
优先级队列操作可以在项目数中具有O(log N)的渐近性能。有许多快速,实用的优先级队列数据结构可以实现这种渐近限制。
由于您要将整个文件作为批处理进行评估,因此您可能希望查看具有分摊性能保证的优先级队列 - 但如果您希望在实时设置中使用您的代码,则应该坚持使用优先级队列严格按查询保证。