以下场景最合适的数据结构是什么: 需要整理股票报价(脚本代码,价格)。每小时,需要按降序报告前N个潦草(最高报价)。 潜在地,报价的数量可以在一小时内达到数百万。 由于经常插入,带有比较器的arraylist将是一场灾难。 TreeSet似乎是一个选项 - 但如果有的话,有人可以提出更好的结构。 (这可以包括构建通用数据结构,而不是使用现有的java集合类。)
答案 0 :(得分: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);
}
请注意,此示例不是线程安全的。
答案 1 :(得分:0)
从编写实时价格Feed的个人经验来看,如果速度是一个问题,那么占用一些额外的内存是值得的。如果可行的话,我会诚实地建议按价格或订单ID散列您的价格。
另外,如果我理解正确,您希望显示符号的前N个价格。虽然这些N价格可能有数百万个订单,但每个订单都可以整理成N个价格水平之一。因此,如果您创建一个价格水平对象,您的数据结构将只需要随机指向这些价格水平对象。在这种情况下,只要N不是太大(因为对于特定符号通常没有那么多的价格水平),一个数组可能在地方性方面很快。
我还认为如果你不想哈希,那么使用圆形数组对于显示价格水平的书来说是一个不错的解决方案。这样,在前面(即最低价格)和结束(最高价)的插入应该是平均的恒定时间。您还可以使用阴影数组来确保O(1)恒定时间插入。