Java 数据结构之堆的概念与应用

Java 数据结构之堆的概念与应用

堆的概念

在计算机科学中,堆(Heap)是一种特殊的数据结构,是一棵树,每个父节点的键值都小于其子节点的键值,这样的堆成为小根堆(Min Heap),反之成为大根堆(Max Heap)。在堆中没有父子关系的节点之间也没有其他约束关系。常见的堆有二叉堆、斐波那契堆等。

对于小顶堆,任意节点的键值都小于或等于其子节点的键值,根节点的键值最小,可以用于实现优先队列(Priority Queue),时间复杂度为logN。

堆的应用

二叉堆

二叉堆是堆的一种常见而简单的实现,它可以用来实现堆栈(Heap Stack)和优先队列(Heap Priority Queue)。二叉堆分为最大堆和最小堆两种。

最大堆

在最大堆中,任何一个父节点的值都大于或等于其左右子节点的值,即根节点的值最大。

Java中的PriorityQueue就是一种基于最大堆的实现,可以通过以下代码创建:

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

最小堆

在最小堆中,任何一个父节点的值都小于或等于其左右子节点的值,即根节点的值最小。

可以通过以下代码创建:

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

堆排序

堆排序是一种原地排序算法,基于二叉堆实现。具体步骤如下:

  1. 将要排序的数组构造成二叉堆
  2. 将堆顶元素与堆底元素交换
  3. 重新构造二叉堆,并重复步骤2,直到整个数组排序完成

Java实现代码如下:

public static void heapSort(int arr[]) {
    int n = arr.length;
    for(int i = n/2-1; i>=0; i--) {
        heapify(arr, n, i);
    }
    for(int i = n-1; i>=0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i, 0);
    }
}

private static void heapify(int arr[], int n, int i) {
    int largest = i;
    int left = 2*i + 1;
    int right = 2*i + 2;
    if(left<n && arr[left]>arr[largest]) {
        largest = left;
    }
    if(right<n && arr[right]>arr[largest]) {
        largest = right;
    }
    if(largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapify(arr, n, largest);
    }
}

示例说明

下面通过一个示例,说明堆的应用和使用:

假设有一个数组,我们需要找到其中第K大的数,可以通过构造一个小根堆,遍历数组将元素加入到堆中,并控制堆的大小不超过K,遍历完成后堆顶元素即为第K大的数。

代码如下:

public static int findKthLargest(int[] nums, int k) {
    PriorityQueue<Integer> pQueue = new PriorityQueue<Integer>();
    for(int i=0; i<nums.length; i++) {
        pQueue.offer(nums[i]);
        if(pQueue.size() > k) {
            pQueue.poll();
        }
    }
    return pQueue.peek();
}

另一个示例是使用堆排序对数组进行排序,代码如下:

int[] arr = new int[]{7, 3, 5, 2, 6, 1, 4};
heapSort(arr);
System.out.println(Arrays.toString(arr));

输出结果为[1, 2, 3, 4, 5, 6, 7]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java 数据结构之堆的概念与应用 - Python技术站

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

相关文章

  • Java常用类库Apache Commons工具类说明及使用实例详解

    Java常用类库Apache Commons工具类说明及使用实例详解 什么是Apache Commons Apache Commons是一个旨在提供高质量、可重用的Java组件的项目。它由许多不同的子项目组成,提供了很多常用的工具类、数据结构和算法等功能。 常用的Apache Commons子项目 Apache Commons项目包含很多子项目,下面列举一些…

    Java 2023年5月19日
    00
  • Spring Annotaion Support详细介绍及简单实例

    Spring Annotaion Support详细介绍及简单实例 Spring Framework是现代Java应用程序开发的一个常用框架。其中,注解(Annotation)是Spring Framework一项强大的功能。Spring注解简化了Spring开发工作流程,并将开发人员从XML配置文件中解放出来。本文将对Spring注解进行详细介绍,并提供两…

    Java 2023年6月15日
    00
  • Java面试题冲刺第二十天–算法(1)

    Java面试题冲刺第二十天–算法(1)攻略 前言 在面试Java开发岗位时,算法是面试官必问的一个方面。在Java面试题冲刺系列的第二十天,我们探讨的是算法相关的问题。本篇攻略主要讲解与算法相关的顶级问题、常用排序算法与查找算法。 算法相关顶级问题 什么是排序算法? 判断一个排序算法的效率主要有两个指标:时间复杂度和空间复杂度。时间复杂度通常作为衡量排序算…

    Java 2023年5月19日
    00
  • emoji表情与unicode编码互转的实现(JS,JAVA,C#)

    Emoji表情和Unicode编码是两种不同的字符编码方式,它们的字符集和编码方式不同,但它们之间是可以互相转换的。本文主要介绍在JS、JAVA、C#中实现Emoji表情和Unicode编码互转的实现攻略,包含几个常用的实例。 JS实现 在JS中,可以使用String.prototype.charCodeAt()和String.fromCharCode()方…

    Java 2023年5月20日
    00
  • Java实现冒泡排序算法

    当需要对一个数组(或者列表)进行排序时,冒泡排序是最基本的一种排序算法之一。下面详细讲解Java实现冒泡排序算法的完整攻略。 定义 “冒泡排序”指的是通过不断地比较相邻的元素,并交换不合适的元素位置,从而逐步将无序的元素移动到正确的位置。它的过程像气泡不断从水中升起,因此得名“冒泡排序”。 实现 下面是Java实现冒泡排序的示例代码: public stat…

    Java 2023年5月19日
    00
  • mvc 、bootstrap 结合分布式图简单实现分页

    MVC、Bootstrap结合分布式图简单实现分页攻略 本文将详细讲解如何使用MVC、Bootstrap和分布式图来实现分页功能。我们将使用SpringMVC作为MVC框架,Bootstrap作为前端框架,分布式图作为数据可视化工具。本文将提供两个示例说明,以帮助您更好地理解如何实现分页功能。 1. 创建SpringMVC项目 首先,我们需要创建一个Spri…

    Java 2023年5月18日
    00
  • IntelliJ IDEA使用教程从入门到上瘾(2019图文版)

    IntelliJ IDEA使用教程从入门到上瘾(2019图文版) IntelliJ IDEA 是一款集成开发环境(IDE),被广泛应用于 Java 开发。本教程将从入门到上瘾,讲解 IntelliJ IDEA 的使用方法。 下载和安装 IntelliJ IDEA 下载 IntelliJ IDEA 的安装包,可前往官网下载: https://www.jetbr…

    Java 2023年5月19日
    00
  • MyBatis框架关联映射实例详解

    让我来为您详细讲解“MyBatis框架关联映射实例详解”的攻略。 1. 什么是MyBatis框架关联映射 MyBatis框架关联映射,简称MyBatis关联映射,是MyBatis框架中一项重要功能,它可以通过配置文件实现多个数据表之间的关联映射。在进行数据查询操作时,我们经常需要多表关联查询,此时就需要采用MyBatis框架关联映射来处理。下面我将会通过一个…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部