最快访问50万收藏中的某个成员

本文关键字:成员 收藏 访问 50万 | 更新日期: 2023-09-27 18:29:31

可能重复:
从订单构建订单簿示例

我想从订单的例子中重新表述我之前的问题构造订单簿,因为它的措辞非常糟糕,请不要阅读:)

我收到订单更新,每个订单都有+1个订单ID:

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

假设最初ordersorderbook都是空

我想我应该写这样的东西:

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"。我只需要活动订单的"lastQuality"。

  • 订单总数不超过100000 000
  • 活跃订单少于500000

最快访问50万收藏中的某个成员

您可以尝试SortedDictionary。下面是一篇关于dictionary与hash与sortedlist与sorteddictionary集合的性能的好文章:http://blog.bodurov.com/Performance-SortedList-SortedDictionary-Dictionary-Hashtable/

从本质上讲,插入物很贵,但取回物则不然。

来自MSDN:

SortedDictionary泛型类是一个二进制搜索具有O(logn)检索的树,其中n是词典在这方面,它类似于SortedList泛型类。这两个类具有相似的对象模型,并且两者都具有O(logn)检索。这两个类别的不同之处在于内存使用和插入和移除速度:

SortedList使用的内存少于SortedDictionary。

SortedDictionary具有更快的插入和删除速度未排序数据的操作:O(logn),而不是O(n)排序列表。

如果从排序的数据一次全部填充列表,SortedList比SortedDictionary快。

SortedDictionary泛型类是一个二进制搜索具有O(logn)检索的树,其中n是词典在这方面,它类似于SortedList泛型类。这两个类具有相似的对象模型,并且两者都具有O(logn)检索。这两个类别的不同之处在于内存使用和插入和移除速度:

SortedList使用的内存少于SortedDictionary。

SortedDictionary具有更快的插入和删除速度未排序数据的操作:O(logn),而不是O(n)排序列表。

如果从排序的数据一次全部填充列表,SortedList比SortedDictionary快。

您可以使用List,而不是数组,因为没有确定的大小。它将根据需要自行增长,而不会从一开始就过大或创建过多的新阵列。

字典不会那么糟糕。它可能会比List浪费更多的空间,而且由于冲突,执行速度会稍微慢一些,但这不是一个糟糕的解决方案。Dictionary使用"delete"操作也会表现得更好,所以如果你做了很多删除操作,我会使用Dictionary。