for (UserSimilarityDTO userSimilarityDTO : userSimilarityDTOList) {
if (minHeap.size() < topN) {
minHeap.offer(userSimilarityDTO);
System.out.println(minHeap.peek().getSimilarity());
} else if (minHeap.peek().getSimilarity() < userSimilarityDTO.getSimilarity()) {
minHeap.poll();
minHeap.offer(userSimilarityDTO);
}
}
上述代码块,首先把前N个元素排满,然后,再比大小,找到最大的前N个。这种算法,占用内存少,但是时间复杂度略高。
Collections.sort(userSimilarityDTOList, new Comparator<userSimilarityDTO>() {
@Override
public int compare(UserSimilarityDTO o1, UserSimilarityDTO o2) {
return o2.getSimilarity() - o1.getSimilarity();
}
});
for (int i = 0; i < N; i++) {
minHeap.offer(userSimilarityDTOList.get(i));
}
下面这个算法的话,思路更加清晰,但是需要更多的内存。