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