C++ 如何优化交易算法以获得最有效的速度

C++ 如何优化交易算法以获得最有效的速度,c++,algorithm,C++,Algorithm,假设您希望实现一种算法,该算法以以下方式工作: 您从包含以下表单值的文件中读取: Mark Buy 20 1 100 Bob Sell 20 2 90 如果输入采用以下形式: Mark Buy 20 1 100 Bob Sell 20 2 90 匹配买家和卖家的最快方法是什么(对于某些公司来说,只有当该公司的买入价最高的人大于该公司卖出价最低的人时,才会匹配买家和卖家)。最高的买入或卖出将决定使用什么价格 因此,在给出的例子中,我们会有“马克,在时间1,在时间2,以100美元从鲍勃

假设您希望实现一种算法,该算法以以下方式工作:

您从包含以下表单值的文件中读取:

Mark Buy  20 1 100
Bob  Sell 20 2 90
如果输入采用以下形式:

Mark Buy  20 1 100
Bob  Sell 20 2 90

匹配买家和卖家的最快方法是什么(对于某些公司来说,只有当该公司的买入价最高的人大于该公司卖出价最低的人时,才会匹配买家和卖家)。最高的买入或卖出将决定使用什么价格

因此,在给出的例子中,我们会有“马克,在时间1,在时间2,以100美元从鲍勃那里买了20个谷歌。”

我们如何优化此算法以提高速度?阅读整个文件是否是一个最佳解决方案?

您需要的是每种商品两个:一个用于主动买入出价(按最高价格优先),一个用于主动卖出出价(按最低价格优先),另外还有一个用于出价创建/到期事件(按时间优先)。(如果您的出价如所述位于批处理文件中,而不是因果/在线序列中,则您可以只对创建/到期事件进行排序,但仍需要购买和出售队列)

使用优先级队列是关键;之后的一切都是管道:

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(logn)。有许多快速、实用的优先级队列数据结构可以达到这个渐近极限


由于您要将整个文件作为一个批处理进行评估,您可能希望查看具有摊销性能保证的优先级队列——但如果您希望在实时设置中使用代码,您可能应该坚持使用具有严格的每查询保证的优先级队列。

那么,交易算法在哪里?:)黑箱优化。太激动人心了:)任何帮助都会很棒!你拿出一个分析器,看看它的速度有多慢。我还想说的是,听起来你还没有一个算法——所以从技术上说,你在寻找一个算法,而不是优化一个优先级队列,对于这项工作来说并不是最有效率的,因为它们执行多次销售,然后进行大量购买,或者多次购买,然后在O(nlogn)复杂性上进行大幅度销售。例如,假设放置了100,1个数量的销售,然后放置了1100个数量的购买。如果我们使用优先级队列,我们必须删除顶部,然后重新调整,因为所有n次销售都需要O(nlogn)时间。我相信,这个操作可以在O(n)时间内完成。我只是不知道怎么做。一般来说,每个元素不能比O(logn)做得更好,因为如果您以不同的价格完成N个订单,您需要对它们进行排序,以确定哪些必须首先完成,哪些不能在O(N logn)以下完成。但是,如果具有相同价格的多个投标是常见情况,则可以将相同价格的投标聚合到相同的优先级队列条目中,这会将处理K个相同价格投标的成本提高到O(K+log N),其中N是队列中不同价格的数量。好的,如果可用价格数量有限,可以在O(ln)中执行基数排序,其中L是存储价格所需的位数。也许有一些方法可以利用这一点,但我会先搜索专门用于此类有限大小密钥的优先级队列。。。