簡體   English   中英

從大量輸入中獲取排序列表(有限長度)的最佳方法是什么

[英]What is the best way to get a sorted list (of finite length) from a large set of input

假設我有1億個Comparable作為流輸入,並且我想輸出該輸入的前100個(按順序-如果您能找到前100個,我認為這是微不足道的)。 我假設某種插入類型是最好的,但是實現它的最佳方法是什么(如果這是最好的方法)?

約束條件是您肯定每次只能看到一個對象(而且我絕對不能將整個對象放入內存中)。

我在想兩種可能的解決方案:

1)一個簡單的鏈表。 因此,當前100個對象進入時,它們將被排序(花費O(n)時間-但n = 100)。 然后,隨着每個連續對象的進入,它將被正確地插入(再次為O(n),n = 100,時間),並且如果插入,它將被踢出尾巴(否則,如果鏈表超出最大值,則鏈表將保持不變)值)。

2)使用堆。 我認為我可以保留一個堆,將其插入到堆中,然后如果堆的大小大於我的最大元素數(在我的情況下為100個),則丟棄根節點(堆的頂部)。 這應該意味着O(lg(n))運行時,對嗎? 因為元素的插入和根的刪除都是O(lg(n)),對嗎?

Java中是否有用於堆的好的庫? 我真的不想編碼自己的堆結構。

PS

如果您想知道為什么要這么做,那是出於幻想足球的目的。 我有一個程序,可以在salaray上限的約束下找到一組玩家的最大投影點(這是蠻力算法)。 實際上,這完全是另一個問題,那就是如何解決背包問題,在這種情況下您必須擁有一定數量的不同類型的物品(即1個QB,3個WR,2個RB,1個TE,1 K和1個防御)。

所以我有一大群(1,234)球隊,他們給出的得分最少。但是現在,我正在嘗試尋找具有眾多不同球員的球隊。 我認為由三支團隊組成的小組是可以解決的(通過蠻力):1,234選擇3 = 312,419,184(根據我的計算,這大約需要一個半小時的處理時間)。 我根據一組球員出現在每個團隊中的次數來計算一組團隊的方差(因此值越低,團隊的方差就越高)。

如果您要做的只是添加,則可以使用它。

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 <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;
        }
    };
}

只需將所有值添加到該集合中,它將只有n值,每次都會丟棄最小的一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM