[英]What it is the best performance way to grab duplicates from a large Set<String>?
[英]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.