当前位置: 首页 > news >正文

【Java数据结构】——堆(找出用于解决最大/最小的n个元素,或者求中位数)

一.堆的介绍

堆是一种基于树的数据机构,用完全二叉树实现(除了最后一层都必须填满)

由于它的特性可以用数组来存储元素

二.建堆(建立大顶堆/小顶堆)

与更大的一个孩子进行交换,直至停止。

堆的力扣题

1.数据流取最大的第K个数

public class StreamKBigNum {private MinHeap minHeap;public StreamKBigNum(int k, int[] nums) {minHeap = new MinHeap(k);}public int add(int val) {if (!minHeap.isFull()){minHeap.offer(val);}else if (minHeap.peek() < val){minHeap.replace(val);}return minHeap.peek();}public static void main(String[] args) {StreamKBigNum test = new StreamKBigNum(3, new int[]{});System.out.println(test.add(3)); // [3] 3System.out.println(test.add(5)); // [3 5] 3System.out.println(test.add(10));System.out.println(test.add(9));System.out.println(test.add(4));}
}

2.数据流取数据的中位数

public class MediumNum {//大顶堆private PriorityQueue<Integer> left = new PriorityQueue<>((a, b) -> Integer.compare(b, a));//小顶堆private PriorityQueue<Integer> right = new PriorityQueue<>();public void addNum(int num) {if (left.size() == right.size()){right.offer(num);Integer poll = right.poll();left.offer(poll);}else {left.offer(num);right.offer(left.poll());}}public double findMedian() {if (left.size() == right.size()){return (left.peek() + right.peek()) / 2.0;}else {return left.peek();}}public static void main(String[] args) {MediumNum test = new MediumNum();test.addNum(1);test.addNum(2);test.addNum(3);test.addNum(7);test.addNum(8);test.addNum(9);System.out.println(test.findMedian());test.addNum(10);System.out.println(test.findMedian());test.addNum(4);System.out.println(test.findMedian());}
}

3.收集hashmap缓存中出现频率最高的n个字符串

    public void QueryTopN(List<String> input, List<String> result, int n) {// 统计每个字符串出现的次数Map<String, Integer> frequencyMap = new HashMap<>();for (String str : input) {frequencyMap.put(str, frequencyMap.getOrDefault(str, 0) + 1);}// 小顶堆,用于存储出现次数最多的n个字符串PriorityQueue<Map.Entry<String, Integer>> minHeap = new PriorityQueue<>((e1, e2) -> e1.getValue().compareTo(e2.getValue()));for (Map.Entry<String, Integer> entry : frequencyMap.entrySet()) {if (minHeap.size() < n) {minHeap.offer(entry);} else if (entry.getValue() > minHeap.peek().getValue()) {minHeap.poll();minHeap.offer(entry);}}// 将堆中的元素取出并反转,得到出现次数从多到少的结果List<String> temp = new ArrayList<>();while (!minHeap.isEmpty()) {temp.add(minHeap.poll().getKey());}Collections.reverse(temp);result.addAll(temp);}

用大顶堆实现优先级队列

http://www.dtcms.com/a/428257.html

相关文章:

  • Python快速入门专业版(五十一):Python异常处理进阶:try-except-finally与raise语句(资源释放与主动抛异常)
  • 买家秀接口深度开发:从内容解析到情感分析的全链路实现
  • 密钥管理系统KSP在智能水表行业的应用
  • 中国建设银行网站多少汕头网站建设过程
  • 基于STM32与influxDB的电力监控系统-6
  • 【教程】nvidia-smi dmon获取GPU相关的完整信息
  • wordpress 网站上传制作网站的公司叫什么
  • 服装网站建设运营规划扬州网站建设推广
  • 网站后台管理怎么进asp网站服务建设
  • 公司建网站多少钱一个免费网页代理在线
  • 大连网站建设 青鸟传媒百度云平台建设网站
  • 豆各庄做网站的公司网站版块设计是什么意思
  • 代发新闻稿的网站四大软件外包公司
  • 信用体系建设网站维运工作制度任丘建设网站制作
  • JavaBean参数校验
  • 洛阳php网站开发桂林象鼻山照片
  • 第八章 惊喜13 落子无悔
  • 手机网站开发计划门户网站平台建设的经费
  • Playwright MCP浏览器自动化详解指南
  • 本地部署开源流处理框架 Apache Flink 并实现外部访问
  • Java 大视界 -- 基于 Java 的大数据分布式存储在科研数据管理与共享中的创新应用(418)
  • 网站二级页怎么做手机网站设计与规划
  • iOS 抓包工具有哪些?实战对比、场景分工与开发者排查流程
  • 上海浦东网站建设公司在深圳注册一个公司需要多少钱
  • 机械网站建设公司推荐seo如何优化网站
  • 网站内容质量南宁网站建设索王道下拉
  • 外贸网站模版用什么做视频网站比较好的
  • 自己写算法(八)JS加密保护解密——东方仙盟化神期
  • 推广网站有什么方法南宁网站推广流程
  • 并查集基础