Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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_Algorithm_Sorting - Fatal编程技术网

Java 从大量输入中获取(有限长度)排序列表的最佳方法是什么

Java 从大量输入中获取(有限长度)排序列表的最佳方法是什么,java,algorithm,sorting,Java,Algorithm,Sorting,因此,假设我有1亿个可比较的流式输入,我想输出该输入中的前100个(按顺序——如果你能找到前100个,我想这是微不足道的)。我假设某种插入排序是最好的,但实现这一点的最佳方法是什么(如果它是最好的方法) 约束条件是,您肯定会看到每个对象,一次一个(我肯定无法将整个对象集放入内存) 我在考虑两种可能的解决方案: 1) 一个简单的链表。因此,当前100个对象进入时,它们将被排序(需要O(n)个时间,但n=100)。然后,当每个连续对象进入时,它将被正确插入(再次是O(n),n=100,time),如

因此,假设我有1亿个可比较的流式输入,我想输出该输入中的前100个(按顺序——如果你能找到前100个,我想这是微不足道的)。我假设某种插入排序是最好的,但实现这一点的最佳方法是什么(如果它是最好的方法)

约束条件是,您肯定会看到每个对象,一次一个(我肯定无法将整个对象集放入内存)

我在考虑两种可能的解决方案:

1) 一个简单的链表。因此,当前100个对象进入时,它们将被排序(需要O(n)个时间,但n=100)。然后,当每个连续对象进入时,它将被正确插入(再次是O(n),n=100,time),如果插入,它将踢出尾部(否则,如果它高于最大值,链表将保持不变)

2) 使用堆。我想我可以保留一个堆,插入到堆中,然后丢弃根节点(堆的顶部),如果堆的大小超过我的最大元素数(在我的例子中是100个)。这应该意味着O(lg(n))运行时,对吗?因为元素的插入和根的删除都是O(lg(n)),对吗

Java中是否有适合堆的好库?我真的不想编写自己的堆结构

p、 美国

如果你想知道我为什么这么做,那是为了幻想足球。我有一个程序,可以在salaray cap的约束下找到一组玩家的最大投影点(这是一个蛮力算法)。事实上,这完全是另一个问题,那就是如何解决背包问题,你必须有一组不同类型的物品(即1个QB、3个WRs、2个RBs、1个TE、1个K和1个防御)


所以我有一大组(1234)的球队,他们给出了最低的预测分数,但现在我正试图找到一组拥有不同球员的球队。我认为由三个团队组成的小组是合理的(通过暴力):1234选择3=312419184(根据我的计算,这将需要大约一个半小时的处理时间)。我将一组球队的方差计算为一名球员在每个球队中出现的次数(因此该值越低,该组球队的方差越高)。

如果您所做的只是添加,则可以使用此值

public static <T> SortedSet<T> topValues(final int n, final Comparator<T> comparator) {
    return new TreeSet<T>(comparator) {
        @Override
        public boolean add(T t) {
            // if less than N in size, just try to add it.
            if (super.size() < n)
                return super.add(t);

            T first = super.first();
            // if smaller than the first, discard it.
            if (comparator.compare(t, first) <= 0)
                return false;
            // otherwise try to add it.
            super.remove(first);
            super.add(t);
            return true;
        }
    };
}
public static SortedSet topValues(最终整数n,最终比较器){
返回新树集(比较器){
@凌驾
公共布尔加法(T){
//如果大小小于N,请尝试添加它。
if(super.size()如果(comparator.compare(t,first)使用
TreeSet
只存储前100名?@DavidWallace谢谢,我想这正是我想要的(在堆实现方面)。我只需要正确地对项目排序(这意味着适当地实现
compareTo
方法)。如果你的100是一个常量(看起来是这样的),从大O的角度来说,不管你做什么,你的算法总是
O(n)
,输入的大小是
n
。我不认为堆和数组之间的性能差异(使用插入排序)只需要100个元素就足够了。你可以简单地尝试这两种方法并进行测量。@VincentvanderWeele既然我问了这个问题,我应该对它们进行计时并返回给你——尽管你可能是对的……唯一的问题是插入排序需要做更多的工作(对我来说)而不是使用
TreeSet
类。如果使用
TreeSet
是最省力的:一定要这样做!
public static <T extends Comparable<T>> SortedSet<T> topValues(final int n) {
    return new TreeSet<T>() {
        @Override
        public boolean add(T t) {
            // if less than N in size, just try to add it.
            if (super.size() < n)
                return super.add(t);

            T first = super.first();
            // if smaller than the first, discard it.
            if (t.compareTo(first) <= 0)
                return false;
            // otherwise try to add it.
            super.remove(first);
            super.add(t);
            return true;
        }
    };
}