Java数据结构之堆(优先队列)详解

yizhihongxing

Java数据结构之堆(优先队列)详解

概述

堆是一种基于树的数据结构,它可以用来解决很多问题,例如排序、优先队列等。在堆中,每个节点的值都小于或等于它的子节点的值。堆分为两种类型:最大堆和最小堆。在最大堆中,根节点的值最大;而在最小堆中,根节点的值最小。

堆的操作主要有以下两种:

  • 插入:将一个元素插入到堆中,需要维护堆的性质,即节点的值小于或等于子节点的值。
  • 删除:从堆中删除一个元素,需要维护堆的性质。

堆可以用数组来实现,也可以用树来实现。在数组中,每个元素的下标就相当于在树中的节点编号。在最大堆中,堆顶元素是最大的元素,在最小堆中,堆顶元素是最小的元素。

实现

在Java中,堆可以通过PriorityQueue来实现。PriorityQueue是一种优先队列,它维护了一个小根堆。

创建PriorityQueue

PriorityQueue<Integer> minHeap = new PriorityQueue<>();

创建一个空的PriorityQueue,可以通过指定一个Comparator来创建最大堆。

PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

插入元素

向PriorityQueue中插入一个元素。

minHeap.add(5);

删除元素

从PriorityQueue中删除一个元素。

minHeap.poll();

获取堆顶元素

获取PriorityQueue的堆顶元素。

minHeap.peek();

示例

以下是一个使用PriorityQueue来解决Top K问题的示例。

public int[] topK(int[] nums, int k) {
    PriorityQueue<Integer> minHeap = new PriorityQueue<>();
    for (int i : nums) {
        minHeap.add(i);
        if (minHeap.size() > k) {
            minHeap.poll();
        }
    }
    int[] res = new int[k];
    int i = 0;
    while (!minHeap.isEmpty()) {
        res[i++] = minHeap.poll();
    }
    return res;
}

以上示例使用了一个大小为k的最小堆来解决Top K问题,时间复杂度为O(nlogk)。在遍历数组时,如果堆的大小超过了k,则删除堆顶元素。最后,Top K的元素就是堆中剩余的元素。

另一个示例是使用PriorityQueue来解决合并K个有序数组的问题。

public int[] mergeKSortedArrays(int[][] arrays) {
    PriorityQueue<int[]> minHeap = new PriorityQueue<>((a, b) -> a[0] - b[0]);
    for (int i = 0; i < arrays.length; i++) {
        if (arrays[i].length > 0) {
            minHeap.add(new int[]{arrays[i][0], i, 0});
        }
    }
    int[] res = new int[arrays.length * arrays[0].length];
    int i = 0;
    while (!minHeap.isEmpty()) {
        int[] cur = minHeap.poll();
        res[i++] = cur[0];
        if (cur[2] < arrays[cur[1]].length - 1) {
            minHeap.add(new int[]{arrays[cur[1]][cur[2] + 1], cur[1], cur[2] + 1});
        }
    }
    return res;
}

以上示例使用了一个大小为K的最小堆来解决合并K个有序数组的问题,时间复杂度为O(nlogk)。在每次取堆顶元素时,将其从它所在的数组中的下一个元素插入到堆中。重复此步骤直到堆为空,这样就得到了合并后的有序数组。

结论

堆是一种非常有用的数据结构,可以用来解决很多问题。在Java中,可以使用PriorityQueue来实现堆的功能,并通过Comparator来实现最大堆和最小堆。PriorityQueue可以用来解决Top K问题和合并K个有序数组的问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据结构之堆(优先队列)详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • Java数据结构之队列(动力节点Java学院整理)

    Java数据结构之队列(动力节点Java学院整理) 队列是一种有序列表,在其中所有插入操作必须在后端进行,而所有的删除操作必须在前端进行的数据结构。这种结构有时被称为先进先出(FIFO)。 队列的分类 普通队列:队列和栈一样,都是只能在一端进行插入操作,在另一端进行删除操作的特殊线性表。队列的特点是:先进先出。适用于数据必须按照插入顺序处理的必要场合。 双端…

    数据结构 2023年5月17日
    00
  • C语言数据结构之顺序数组的实现

    C语言数据结构之顺序数组的实现 前言 顺序数组是数据结构的一个重要部分,它代表着一种基本的数据结构,能够在数据存储与访问方面发挥极大的作用。本文将详细讲解如何在C语言中实现顺序数组。 简介 顺序数组是在物理内存中顺序存储的一组元素数据,可以通过下标访问任意一个元素。通常情况下,顺序数组的数据类型是相同的,而且每一个元素的大小也是相同的。 实现 实现顺序数组主…

    数据结构 2023年5月17日
    00
  • Java 数据结构与算法系列精讲之二叉堆

    Java 数据结构与算法系列精讲之二叉堆 什么是二叉堆? 二叉堆是一种基于完全二叉树的数据结构,它分为大根堆(MaxHeap)和小根堆(MinHeap)。大根堆的每个节点的值都大于(或等于)它的子节点的值,小根堆的每个节点的值都小于(或等于)它的子节点的值。 二叉堆的操作 二叉堆主要有以下几种操作: 插入元素:将元素插入到堆的最后一个叶子节点,然后通过上滤操…

    数据结构 2023年5月17日
    00
  • 深入PHP中的HashTable结构详解

    深入PHP中的HashTable结构详解 在PHP中,HashTable是一种基础数据结构,常用于存储对象的属性和方法等各种数据,本篇攻略将深入介绍HashTable的实现原理和应用。 HashTable的实现原理 HashTable并不是一种单一的数据结构,它可以根据不同的需求来采用不同的实现方式。在PHP中,我们经常使用的是基于链表的实现方式,也就是链式…

    数据结构 2023年5月17日
    00
  • C数据结构之双链表详细示例分析

    作为本网站的作者,我很高兴为你讲解C数据结构之双链表详细示例分析的完整攻略。 双链表简介与定义 双链表是链表的一种,在链表中每一个节点都有一个指针域,指向下一个节点,这个指针域称为next指针;而在双链表中每一个节点也有两个指针域,一个指向前驱节点,另一个指向后继节点,即prev指针与next指针。由于双链表存在两个指针域,因此它支持双向遍历,无论是正向还是…

    数据结构 2023年5月17日
    00
  • 四边形不等式学习笔记

    简要题意 四边形不等式是一种 dp 优化策略。多用于 2D DP。 内容 对于区间 \([l,r]\) 带来的贡献 \(w(l,r)\),如果其满足: 对于 \(L\leq l\leq r \leq R\),\(w(L,r)+w(l,R)\leq w(L,R)+w(l,r)\) 则称 \(w\) 满足四边形不等式。特别地,如果上式符号取等,则称其满足四边形恒…

    算法与数据结构 2023年4月17日
    00
  • C语言数据结构深入探索顺序表

    C语言数据结构深入探索顺序表攻略 一、概述 顺序表是一种线性结构,是计算机程序中最常见的数据结构之一。在C语言中,顺序表可以用数组来实现。本篇文章将深入讲解顺序表的原理和实现方法,帮助读者加深对顺序表的理解,并掌握如何用C语言代码实现顺序表。 二、顺序表的定义和特点 顺序表是指用一组地址连续的存储单元依次存储线性表中的各个元素,用于表示具有相同数据类型的n个…

    数据结构 2023年5月17日
    00
  • C++数据结构哈希表详解

    C++数据结构哈希表详解 哈希表(Hash Table)是一种非常重要的数据结构,用于实现字典等各种应用。哈希表将关键字映射到一个固定大小的数据集合中,以支持常数时间复杂度的插入、查找和删除操作。哈希表的核心思想是将关键字通过哈希函数(Hash Function)映射到数据集合中的一个索引位置,哈希函数需要满足良好的散列性质,使得关键字能够均匀地散布在数据集…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部