我正在写一个比特币交易者应用程序,它正在从交易所获取订单。典型的订单如下所示:https://www.bitstamp.net/api/order_book/(它有两个部分,“出价”和“询问”,它们应该分开存储,但是在相同的数据结构中)。一种解决方案是仅存储此大型订单簿的一部分,这将解决访问效率问题,但它引入了一系列与一致性和更新限制有关的其他问题。所以现在看来,更好的解决方案是获取订单并不断更新。
现在这个交易者应用程序稍后使用新订单和已删除的订单更新此获取的订单。例如,如果您订购的订单价格为900美元,则可以在订单簿中购买1.5BTC,它可以完全取消,也可以更新为包含更多或更少的BTC。此外,可以在该价格之下或之上添加新订单。
有两个关键操作:
快速找到价格完全相同的订单(如果是的话)
快速找到价格最接近提供的订单,但在其下方
在更新的情况下,我们可能实际上并不知道它是更新,因此我们可能会开始执行(2)并最终执行(1)。
我不是数据结构方面的专家,所以我开始查看最常见的数据,现在我觉得它应该是某种树,但我不确定是哪一种。我最没有受过教育的猜测是一个数据结构,其中每个节点都是价格中的一个数字,因此,例如,要快速查找价格为900美元的所有节点,我们会items['9']['0']
,然后查找叶节点。现在,我的脑子里仍然是一团糟,所以请不要过于苛刻地评价我。任何建议都会很棒。
答案 0 :(得分:2)
听起来你想要一个简单的binary search tree(BST):(好吧,self-balancing一个)
二叉搜索树(BST)是一种基于节点的二叉树数据结构,具有以下属性:
- 节点的左子树仅包含键小于节点键的节点。
- 节点的右子树只包含键大于节点键的节点。
- 左右子树每个也必须是二叉搜索树。
- 必须没有重复的节点(如果需要,可以轻松约束)。
BST允许您有效地执行两个操作 - 查找匹配某个值的元素,或者值最接近但更小的元素。
这两项操作的运行时间均为O(log n)
,更具体地说,比较次数非常接近log2n
,12
约为n = 5000
这几乎没有任何东西(并且有一些工作要重新平衡树,但这应该是类似的工作量。)