我的问题非常简单 - unordered_map<int, int>
我需要以最小的开销跟踪maximum key
。不是在任何时候,而是在某些“检查站”。更多细节如下。
在我的交易应用程序中,我想使用unordered_map
来存储OrderBook项目。它应该将int
映射到int
,其中键是价格,价值是音量。 (实际价格是十进制,但我在内部使用int64)
我将使用两个unordered_map
- 一个用于bid
个订单,一个用于offer
个订单。
我需要知道Bid
- 一张地图的最大键和另一张地图的Offer
最小键。通常我在一个包中有“几个”更新 - 我需要在处理所有更新时重新计算出价和要约。例如,假设我有这样的订单
100 1
102 1
104 1
Bid (max of key) is 104.
现在我有两个更新:
remove key 104
add 103 1
end of transaction
执行应如下:
1:
100 1
102 1
Bid undefined (transaction in progress)
2:
100 1
102 1
103 1
Bid = 103
如何以最小延迟执行?延迟是首要要求,如果忽略延迟,我可以做很多事情:
所以我似乎需要一些简单的算法来跟踪某些集合的最大/最小值,而不是每次都重新计算它?
答案 0 :(得分:2)
您可以用您选择的语言实现AVL树,并通过左树中的最小键和右树中的最大键(即引入minkey和maxkey)的信息扩展节点。字段)。
维护这一点应该相当容易。对于新节点,只需设置minkey = maxkey = key。在插入时,每当您决定遵循左侧或右侧路径时,请相应地更新当前节点的minkey或maxkey字段。类似地,删除和轮换。这样,您将始终在顶级节点中获得最小和最大可用空间。
增加的好处是查找可能会稍快一些,一旦搜索到的密钥低于minkey或大于maxkey,就可以终止查找。
但对我而言,实际上你并不需要这样做,因为在平衡良好的搜索树(例如AVL树)中找到最小/最大键应该是O(log n)的平均值,因此可能整个事情甚至都不值得努力。
如果您需要快速插入/删除unordered_map(即哈希映射),您至少可以通过维护以下数据结构来达到min和max的分摊常量tiome:
class umapminmax {
map<int, int> themap;
int min, max;
}
您必须仅通过此类插入和删除并记录最小值/最大值。每当删除最小或最大密钥时,您需要扫描所有密钥以获得新的最小值/最大值。该扫描是O(n)。但如果不经常发生,那么访问最小值/最大值的摊销时间仍然是不变的。
如果您知道OTOH,可能经常删除最小/最大值,那么带搜索树的O(log n)解决方案可能是您获得的最快速度。
不过,从你描述你的应用程序的方式来看,即便如下也是如此:
如果是这种情况,您可以应用更多逻辑:假设最大密钥被删除。现在,不是扫描地图以获得新的最大值,而是设置一个标志(另一个新字段),指示最大密钥无效。然后,如果插入了另一个键大于或等于无效最大值的值,则只需将此键记录为最大值并重置该标志,以便指示最大值有效。 但是,在检索最大值时,必须查阅该标志并在它说它无效时执行扫描。
你知道,你真的需要一个模型实现,并用现实世界数据做一些统计。