爲什麼沒有下文的工作?
<T> T[] topK(Iterator<? extends T> items, int k, Class<T> clazz, Comparator<? super T> cmp) {
T[] topK = Arrays.newInstance(clazz, k);
if (k == 0) { return topK; }
for (int i = 0; i < k && items.hasNext(); ++i) {
topK[i] = items.hasNext();
}
// TODO: what is the appropriate output when there are less than k input?
Arrays.sort(topK, cmp);
for (T item; items.hasNext();) {
item = items.next();
if (cmp.compareTo(item, topK[k - 1]) < 0) {
int pos = Arrays.binarySearch(topK, item);
if (pos < 0) { pos = ~pos; }
System.arraycopy(topK, pos, topK, pos + 1, k - (pos + 1));
topK[pos] = item;
}
}
return topK;
}
變速周圍是O(K),其是不太理想,但成功的比較的數量應該減小作爲TOPK得到逐漸變大,並且比較每個步驟是爲O(log K)這是與使用PriorityQueues獲得的任何基於堆的方法相同。
你是如何確定什麼是「最大的」設置? – NullUserException 2010-09-28 00:38:41
基數的設置... .size() – badroit 2010-09-28 00:41:18
您的解決方案聽起來不錯。你必須「偷看()」來知道當前集合是否比隊列中最差的一個更好。您還必須在「比較」功能中打破關係。 – 2010-09-28 00:44:32