我想重新解释我之前的问题construct orderbook from orders example,因为它非常糟糕,请不要阅读它:)
我收到订单更新,每个新订单都有+1 orderId:
new orderid = 1 price = 100 quantity = 10
new orderid = 2 price = 101 quantity = 10
modify orderid = 1 price = 100 quantity = 8
new orderid = 3 price = 100 quantity = 7
new orderid = 4 price = 101 quantity = 3
delete orderid = 1
and so on
在每次订单更新时,我需要在delete orderid = 1
之后计算订单簿:
price = 100 totalQuantity = 7
price = 101 totalQuantity = 13
我们假设最初orders
和orderbook
都是空的
我想我应该这样写:
if (order.action = add)
orderBook[order.price] += order.quantity
if (order.action = delete)
orderBook[order.price] -= getLastQuantity(order.id)
if (order.action = modify)
orderBook[order.price] += order.quantity - getLastQuantity(order.id)
可能你可以建议不同的实现,但这个是我认为最微不足道的
问题是:如何实施getLastQuantity(int orderId)
琐碎的实施:
int[] lastQuantity = new int[100000000];
public int getLastQuantity(int orderId) {
return lastQuantity[orderId];
}
占用太多内存,我甚至不确定它有多快
另一个简单的实现是使用Dictionary
,但我有有序的int键一个接一个我如何使用这个事实来提高性能?
注意一旦订单被删除,我不需要记住它的“lastQuantity”。我只需要“lastQuantity”的有效订单。
答案 0 :(得分:1)
您可以尝试使用SortedDictionary。这是关于字典与散列与排序列表与排序字典集合的性能的好文章:http://blog.bodurov.com/Performance-SortedList-SortedDictionary-Dictionary-Hashtable/
基本上,插入是昂贵的但是检索不是。
来自MSDN:
SortedDictionary通用类是二进制搜索 具有O(log n)检索的树,其中n是元素的数量 字典。在这方面,它类似于SortedList泛型类。这两个类具有相似的对象模型,并且 两者都有O(log n)检索。两个班级不同的地方是 记忆的使用和插入和移除的速度:
SortedList比SortedDictionary使用更少的内存。
SortedDictionary具有更快的插入和删除功能 未排序数据的操作:O(log n)而不是O(n) 排序列表。
如果列表是从排序数据中一次性填充的, SortedList比SortedDictionary快。
SortedDictionary通用类是二进制搜索 具有O(log n)检索的树,其中n是元素的数量 字典。在这方面,它类似于SortedList泛型类。这两个类具有相似的对象模型,并且 两者都有O(log n)检索。两个班级不同的地方是 记忆的使用和插入和移除的速度:
SortedList比SortedDictionary使用更少的内存。
SortedDictionary具有更快的插入和删除功能 未排序数据的操作:O(log n)而不是O(n) 排序列表。
如果列表是从排序数据中一次性填充的, SortedList比SortedDictionary快。
答案 1 :(得分:1)
由于没有确定的大小,您可以使用List而不是数组。它将根据需要自行增长,而不是从一开始就过大或创建太多新阵列。
字典不会那么糟糕。它可能比List有更多的浪费空间,并且由于冲突会稍微慢一些,但它不会是一个糟糕的解决方案。通过删除'词典也可以更好地发挥作用。操作,所以如果你做了很多删除,我会去一本字典。