最快获得50万集合的一些成员

时间:2012-03-29 19:13:08

标签: c# algorithm

  

可能重复:
  construct orderbook from orders example

我想重新解释我之前的问题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

我们假设最初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”。我只需要“lastQuantity”的有效订单。

  • 订单总数不超过10亿
  • 有效订单少于500 000

2 个答案:

答案 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有更多的浪费空间,并且由于冲突会稍微慢一些,但它不会是一个糟糕的解决方案。通过删除'词典也可以更好地发挥作用。操作,所以如果你做了很多删除,我会去一本字典。