Java数据结构—堆(Heap)

堆是一种基于完全二叉树的数据结构,其中每个节点都满足堆特性:父节点的值总小于或等于(大于或等于)其子节点的值,这被称为小根堆(大根堆)。


在Java中,可以使用PriorityQueue类来实现堆,它是一个优先队列,因此也被称为优先级队列。可以通过提供自定义比较器来创建最大堆或最小堆。

下面是一个例子,展示如何使用Java代码创建最大堆:

import java.util.*;

public class MaxHeapExample {
    public static void main(String[] args) {
        // 创建一个最大堆
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

        // 添加元素到堆中
        maxHeap.add(10);
        maxHeap.add(30);
        maxHeap.add(20);
        maxHeap.add(5);

        // 输出堆顶元素
        System.out.println("堆顶元素:" + maxHeap.peek());  // 30

        // 删除堆顶元素
        maxHeap.poll();
        System.out.println("删除堆顶元素后,堆顶元素:" + maxHeap.peek());  // 20
    }
}

示例:
一个常见的使用堆的例子是找到前k个最大的元素。可以使用一个最小堆来解决这个问题,将元素逐个添加到堆中,如果堆的大小超过了k,则删除堆顶元素。最终堆中的元素即为前k个最大的元素。

下面是一个使用Java代码实现上述算法的示例:

import java.util.*;

public class TopKExample {
    public static void main(String[] args) {
        int[] nums = {5, 10, 7, 2, 9, 11};
        int k = 3;

        // 创建一个最小堆
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        for (int num : nums) {
            // 添加元素到堆中
            minHeap.add(num);

            // 如果堆的大小超过了k,删除堆顶元素
            if (minHeap.size() > k) {
                minHeap.poll();
            }
        }

        // 输出前k个最大的元素
        System.out.print("前" + k + "个最大的元素:");
        while (!minHeap.isEmpty()) {
            System.out.print(minHeap.poll() + " ");
        }
    }
}

总结:
堆是一种基于完全二叉树的数据结构,具有很好的时间复杂度和空间复杂度,并且可以用来解决许多常见的问题。在Java中,可以使用PriorityQueue类来实现堆。通过提供自定义比较器,可以创建最大堆或最小堆。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值