5

我正在编写一个从交易所获取订单簿的比特币交易者应用程序。典型的订单簿如下所示:https ://www.bitstamp.net/api/order_book/ (它有两部分,“出价”和“询价”,它们应该分开存储,但数据结构相同)。一种解决方案是只存储这个大订单的一部分,这将解决访问效率问题,但它引入了一系列与一致性和更新限制有关的其他问题。因此,目前看来,更好的解决方案是获取订单簿并不断更新。

现在,此交易者应用程序稍后会使用新订单和已删除的订单更新此获取的订单簿。例如,如果您在订单簿中以 900 美元的价格购买 1.5BTC,它可能会被完全取消,或者可能会更新为包含更多或更少的 BTC。此外,可以在该价格以下或以上添加新订单。

有两个关键操作:

  1. 快速找到价格完全相同的订单(在更新或取消的情况下)

  2. 快速找到价格最接近提供的价格但低于它的订单

在更新的情况下,我们可能实际上并不知道它是更新,因此我们可能会开始执行 (2) 并最终执行 (1)。

我不是数据结构方面的专家,所以我开始查看最常见的那些,现在我觉得它应该是某种树,但我不确定是哪一种。我最无知的猜测是一个数据结构,其中每个节点都是价格中的一个数字,因此,例如,要快速找到价格为 900 美元的所有节点,items['9']['0']然后寻找叶节点。现在我脑子里还是一团糟,所以请不要对我评价太苛刻。任何建议都会很棒。

4

1 回答 1

4

听起来你想要一个简单的二叉搜索树(BST):(嗯,一个自平衡的)

二叉搜索树 (BST) 是一种基于节点的二叉树数据结构,具有以下特性:

  • 节点的左子树仅包含键小于节点键的节点。
  • 节点的右子树只包含键大于节点键的节点。
  • 左右子树也必须是二叉搜索树。
  • 必须没有重复的节点(如果需要,这是一个容易绕过的约束)。

BST 允许您有效地执行两项操作 - 找到与某个值匹配的元素,或者找到与该值最接近但更小的元素。

这两个操作的运行时间是O(log n),更具体地说,比较次数非常接近,大约是类似的工作量)。log2n12n = 5000

于 2014-01-19T23:29:32.570 回答