Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 进货数据结构_Java_Data Structures_Collections - Fatal编程技术网

Java 进货数据结构

Java 进货数据结构,java,data-structures,collections,Java,Data Structures,Collections,对于以下场景,最合适的数据结构是什么: 股票报价(股票代码、价格)需要整理。每小时,前N名的股票报价(最高报价)需要按降序报告。 一小时内报价的数量可能会达到数百万。 由于频繁的插入,带有comparator的arraylist将是一场灾难。 树集似乎是一种选择——但如果有更好的结构,有人能建议一种更好的结构吗。 (这可能包括构建一个通用数据结构,而不是使用现有的java集合类。)除了TreeSet之外,我不能提出任何建议,但我可以指出一个可能的优化——似乎到目前为止,任何小于前n个引号的引号都

对于以下场景,最合适的数据结构是什么: 股票报价(股票代码、价格)需要整理。每小时,前N名的股票报价(最高报价)需要按降序报告。 一小时内报价的数量可能会达到数百万。 由于频繁的插入,带有comparator的arraylist将是一场灾难。 树集似乎是一种选择——但如果有更好的结构,有人能建议一种更好的结构吗。
(这可能包括构建一个通用数据结构,而不是使用现有的java集合类。)

除了
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);
}
final int n=。。。;
最终NavigableSet topNquetes=新树集();
无效添加报价(报价){
//如果引号集已达到N,
if(topnquetes.size()=n){
//获得比这一个小的最大报价
Quote lowerQuote=topNQuotes.lower(Quote);
//如果在集合中找不到这样的引号,请退出而不添加
if(lowerQuote==null){
返回;
}
//否则,从集合中删除并放弃最低报价
topnquetes.pollFirst();
}
//将新报价添加到集合中
添加(报价);
}

请注意,这个示例不是线程安全的。

根据编写实时价格提要的个人经验,如果速度是一个问题,那么占用一些额外内存是值得的。如果可行的话,我会真诚地建议您通过价格或订单ID来散列价格提要

另外,如果我理解正确,您希望显示符号的前N个价格。虽然这N个价格上可能有数百万个订单,但每个订单都可以整理成N个价格级别中的一个。因此,如果您创建了一个价格级别对象,那么您的数据结构就必须围绕指向这些价格级别对象的指针进行移动。在这种情况下,只要N不是太大(因为对于一个特定的符号,通常没有那么多的价格水平),一个数组就可能具有足够快的局部性


我还认为,如果您不想散列价格水平簿,使用循环数组将是显示价格水平簿的一个不错的解决方案。这样一来,前端(即最低价格)和末端(最高价格)的插入平均时间都应该是恒定的。您还可以使用阴影数组来确保O(1)恒定时间插入。

谢谢-我想看看我们是否可以通过构建任何通用数据结构来更好地进行树集。堆似乎不是提取1以外的数据的最佳方法-因为每次都会重新定向。一个小误解-我不想报告纸条的前N个引号;但在过去的一个小时里,总的来说,排名前N位的报价。我不需要对每一个新条目进行重新排序;并且能够以降序获得所需的N个引号。