Jdk源码分析

文章40 |   阅读 14784 |   点赞0

来源:https://yumbo.blog.csdn.net/category_10384063.html

PriorityQueue 求解topk问题

x33g5p2x  于2021-12-18 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(337)

java的底层结合了很多数据结构的变化,随着时代的进步,java也与时俱进。
HashMap中的红黑树AQS中的CLH队列内置的堆栈工具类
大小堆算法常常用于计算topk问题求解问题,
而java实际上就已经帮我们写好了,并且集成进jdk类库中。
topk问题可以用下面的优先队列来求解,默认下使用的是最小堆,可以通过传入比较器Comparator 接口来实现最大堆的求解。
PriorityQueue

示例代码如下:

import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Random;
import java.util.Scanner;

public class Demo {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入k值:");
        int k = sc.nextInt();
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Integer::compareTo);
        Random random = new Random();
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i < 100; i++) {
            int num = random.nextInt(50);
            integers.add(num);
            priorityQueue.add(num);// 加入优先队列中
        }
        for (int i = 0; i < k; i++) {
            System.out.print(priorityQueue.poll()+" ");// 从队列中取出一个
        }
        System.out.println("\n所有元素排序后的结果:");
        integers.sort(Integer::compareTo);
        System.out.println(integers);
    }

}

其中的一次执行结果如下,求top5问题

请输入k值:5
1 1 2 2 3 
所有元素排序后的结果:
[1, 1, 2, 2, 3, 4, 4, 6, 6, 7, 7, 7, 7, 7, 8, 8, 9, 9, 10, 11, 11, 11, 11, 12, 13, 14, 14, 14, 14, 15, 15, 16, 17, 17, 17, 19, 20, 21, 21, 21, 22, 22, 22, 22, 22, 23, 24, 25, 26, 27, 28, 28, 29, 29, 29, 29, 30, 31, 31, 31, 32, 32, 32, 32, 32, 33, 34, 34, 34, 35, 35, 35, 36, 36, 38, 38, 38, 39, 39, 40, 42, 42, 42, 42, 42, 43, 45, 45, 46, 46, 46, 46, 46, 47, 48, 49, 49, 49, 49, 49]

相关文章