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

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日

相关文章

  • C++线性表深度解析之动态数组与单链表和栈及队列的实现

    C++线性表深度解析之动态数组与单链表和栈及队列的实现 动态数组的实现 动态数组是一种可以动态扩展的数组结构,它的容量可以随着需要而动态增加。在C++中,使用vector类可以实现动态数组的功能。vector类相当于动态分配了一块内存空间,在使用时可以根据需要进行动态扩展。下面是一个示例代码: #include <vector> #include…

    数据结构 2023年5月17日
    00
  • c语言 数据结构实现之字符串

    下面是详细讲解“c语言 数据结构实现之字符串”的完整攻略。 1. 什么是字符串? 字符串是由一组字符组成的序列,字符可以是字母、数字、标点符号等,字符串常用于文本处理。 在C语言中,字符串是以‘\0’ 结束的字符数组。 2. 字符串的常见操作 常见的字符串操作包括:复制、比较、连接、查找等。 2.1 字符串复制 字符串复制是将一个字符串的内容复制到另一个字符…

    数据结构 2023年5月17日
    00
  • java实现队列数据结构代码详解

    Java实现队列数据结构代码详解 1. 队列数据结构简介 队列(Queue)是一种先进先出(FIFO)的数据结构,支持在一端插入元素,在另一端删除元素并返回删除的元素。其操作包括入队(enqueue)和出队(dequeue)。 2. 队列实现方法 队列可以通过数组或链表来实现。其中,数组实现的队列称为顺序队列,链表实现的队列称为链式队列。 2.1 顺序队列 …

    数据结构 2023年5月17日
    00
  • Java数据结构二叉树难点解析

    Java数据结构二叉树难点解析 什么是二叉树 二叉树是一种非常常见的数据结构,它具有以下特点: 每个节点都最多有两个子节点。 左子节点的值小于等于父节点的值,右子节点的值大于等于父节点的值。 二叉树可以用递归的方式实现,如下所示: class TreeNode { int val; TreeNode left; TreeNode right; TreeNod…

    数据结构 2023年5月17日
    00
  • Java数据结构学习之二叉树

    Java数据结构学习之二叉树 什么是二叉树 二叉树是一种树形数据结构,他的每个节点最多有两个子节点,分别称为左子节点和右子节点。如果一个节点没有子节点,则成为叶子节点。二叉树具有以下性质: 每个节点最多有两个子节点 左子树和右子树是二叉树 二叉树可以为空 二叉树的遍历 为了遍历一棵树,我们可以采用两种算法: 深度优先遍历 深度优先遍历的思路是:从根节点出发,…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法的基础知识和经典算法汇总

    C++数据结构与算法的基础知识和经典算法汇总 1. 基础知识 1.1 数据结构 数据结构是计算机存储、组织数据的方式。这里列出常见的数据结构,包括但不限于: 数组 链表 栈 队列 树 哈希表 1.2 算法 算法是解决问题的步骤和方法。下列是常见的算法: 排序算法 查找算法 字符串算法 图算法 1.3 复杂度 复杂度是算法性能的度量。常见的复杂度表示法有O(n…

    数据结构 2023年5月17日
    00
  • Leetcode Practice — 字符串

    目录 14. 最长公共前缀 思路解析 151. 反转字符串中的单词 思路解析 125. 验证回文串 思路解析 415. 字符串相加 思路解析 3. 无重复字符的最长子串 思路解析 8. 字符串转换整数 (atoi) 思路解析 14. 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “”。 输入:strs = […

    算法与数据结构 2023年4月18日
    00
  • 数据结构串的操作实例详解

    数据结构串的操作实例详解 什么是数据结构串? 数据结构串是由若干个字符按照一定的顺序排列而成的线性结构。可以对串进行许多操作,如子串的截取、串的连接、串的替换等等。 数据结构串的基本操作 串的初始化 为了操作一个串,我们需要先定义一个串并初始化,可以通过以下代码实现: #include <stdio.h> #define MAXSIZE 100 …

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