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日

相关文章

  • 带你了解Java数据结构和算法之哈希表

    带你了解Java数据结构和算法之哈希表 前言 哈希表是一种常用的数据结构,它可以高效地存储和查询数据。在计算机科学领域,哈希表广泛用于实现关联数组(Associative Array)和哈希集合(Hash Set)。本文将带领大家深入了解哈希表数据结构及常用算法实现。 哈希表的原理 哈希表是根据关键码值(Key Value)而直接进行访问的数据结构。也就是说…

    数据结构 2023年5月17日
    00
  • Python数据结构之栈详解

    Python数据结构之栈详解 什么是栈? 栈(stack)是一种数据元素只能在一端进行插入和删除操作的线性表。 栈的特点是后进先出,即在一个非空栈中,最后放入的元素最先被取出。 栈的操作 栈操作的基本有两个: push(elem):插入一个新的元素elem到栈中。 pop():弹出栈顶的元素,并返回这个被弹出元素的值。 此外还有一个用于查询栈顶元素的操作: …

    数据结构 2023年5月17日
    00
  • C语言从猜数字游戏中理解数据结构

    C语言从猜数字游戏中理解数据结构 介绍 在游戏和编程之间有着密切的关系。猜数字游戏是一个经典的小游戏,它也可以作为学习数据结构的一个好教材。 在猜数字游戏中,你可以根据计算机所选数字的提示来猜出正确的数字。这个游戏可以帮助你更好地理解数据结构和算法。 游戏规则 1.计算机系统选择一个要猜的数字。 2.你需要猜出这个数字,计算机每次将你的猜测数字与要猜的数字进…

    数据结构 2023年5月17日
    00
  • C语言近万字为你讲透树与二叉树

    C语言近万字为你讲透树与二叉树 什么是树? 树是一种用来组织数据的非线性数据结构,它由一个根节点和若干个子节点组成,并且每个节点可能有若干个子节点。 什么是二叉树? 二叉树是一种特殊的树,它的每个节点最多只有两个子节点,并且分别称为左子节点和右子节点,左子节点在二叉树中永远排在右子节点的前面。 二叉树的遍历方式 二叉树的遍历方式有三种: 前序遍历(preor…

    数据结构 2023年5月17日
    00
  • Java深入了解数据结构之哈希表篇

    Java深入了解数据结构之哈希表篇 1. 哈希表的定义 哈希表(Hash Table),也叫散列表,是根据关键码值(Key Value)而直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数(Hash Function)。 哈希表是基于哈希函数实现的,哈希函数将关键字映射到哈希表中的位置,如果存在两个…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现字符串分割的实例

    C语言中数据结构实现字符串分割可以用到两种常见数据结构:指针和数组。 方法一:指针 步骤一:创建指针 首先声明一个指针类型的变量,用来存储字符串中单个字符所在的地址: char *ptr; 步骤二:遍历字符串 通过对字符串进行遍历,在每个分隔符位置上获取单词,并通过指针记录下每个单词的地址: char str[] = "C语言-数据结构-字符串分割…

    数据结构 2023年5月17日
    00
  • Redis之常用数据结构哈希表

    Redis之常用数据结构哈希表 Redis是一种开源的、高性能的、基于内存的数据存储系统,它支持多种数据结构,包括字符串、哈希表、列表、集合和有序集合等。其中哈希表是一种常用的数据结构,本文将详细讲解Redis中的哈希表。 哈希表概述 哈希表是一种通过哈希函数和数组实现的数据结构,能够快速地进行插入、查找和删除等操作,时间复杂度为O(1)。在Redis中,哈…

    数据结构 2023年5月17日
    00
  • C语言数据结构之迷宫问题

    C语言数据结构之迷宫问题 迷宫问题是一种基本的搜索问题,其中需要在一个矩阵中寻找从起点到终点的路径。在本篇文章中,我们将以C语言为例,介绍迷宫问题的完整攻略。 准备工作 在开始之前,我们先要准备好数据结构。为了表示迷宫,我们使用一个二维数组。其中,0表示可以通过的路,1表示障碍物不可通过。为了记录路径,我们还需要使用一个二维数组来表示每个格子是否已经被访问过…

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