以下场景最合适的数据结构是什么:需要整理股票报价(股票代码、价格)。每小时,需要按降序报告前 N 个股票(最高报价)。潜在地,一个小时内的报价数量可能达到数百万。由于频繁插入,带有比较器的数组列表将是一场灾难。TreeSet 似乎是一种选择 - 但有人可以建议一个更好的结构,如果有的话。(这可以包括在通用数据结构上构建,而不是使用现有的 java 集合类。)
问问题
625 次
2 回答
0
除了 ,我不能提出任何建议TreeSet
,但我可以指出一个可能的优化 - 似乎任何低于迄今为止第 N 个报价的报价根本不需要添加。这意味着树的大小最多为 N,而不是无界。
例如:
final int n = ...;
final NavigableSet<Quote> topNQuotes = new TreeSet<Quote>();
void addQuote(Quote quote) {
//if the Set of quotes has reached N,
if (topNQuotes.size() == n) {
//get the greatest Quote that is less than this one
Quote lowerQuote = topNQuotes.lower(quote);
//if no such Quote was found in the Set, quit without adding
if (lowerQuote == null) {
return;
}
//otherwise remove and discard the lowest Quote from the Set
topNQuotes.pollFirst();
}
//add the new Quote to the Set
topNQuotes.add(quote);
}
请注意,此示例不是线程安全的。
于 2012-10-18T05:59:16.920 回答
0
从编写实时价格馈送的个人经验来看,如果速度是一个问题,那么占用一些额外的内存是值得的。老实说,如果可行的话,我会建议按价格或订单 ID 对您的价格信息进行散列。
另外,如果我对您的理解正确,您希望显示一个交易品种的前 N 个价格。虽然这 N 个价格可能有数百万个订单,但它们每个都可以整理成 N 个价格水平之一。因此,如果您创建一个价格水平对象,您的数据结构只需围绕指向这些价格水平对象的指针进行洗牌。在这种情况下,只要 N 不太大(因为特定交易品种的价格水平通常没有那么多),数组可能在局部性上足够快。
我还认为,如果您不想散列它,那么使用循环数组将是显示价格水平书籍的一个不错的解决方案。这样,在前面(即最低价格)和结尾(最高)的插入平均应该是恒定的时间。您还可以使用影子数组来确保 O(1) 恒定时间插入。
于 2012-10-18T06:55:06.503 回答