根据List和Queue,筛选出值最大的前N个值。两种算法的比较

12 阅读1分钟
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));
}

下面这个算法的话,思路更加清晰,但是需要更多的内存。