迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

在 Java 中实现最小最大堆

作者:迹忆客 最近更新:2023/11/28 浏览次数:

本文将使用 PriorityQueue 类实现一个最大堆和一个最小堆。我们还将演示从堆中插入和删除元素。


Java 中的 Min-Max 堆介绍

堆是一种基于树的数据结构,它形成了一个完整的二叉树。堆被表示为一个数组。有两种类型的堆,它们是最小堆和最大堆。最小堆,也称为最小堆,在其根节点或父节点中具有最小值。类似地,最大堆在根节点或父节点中具有最大值。因此,堆数据结构使得从数组中提取最大和最小元素变得更加容易。我们可以得到 O(1) 中最大和最小的元素。从堆中删除或插入元素的复杂性是 O(log N)

最小-最大堆是一种包含交替的最小和最大级别的数据结构。根节点包含最小值,其下一层代表最大值。最小值用偶数级别(如 0、2、4)表示。奇数级别(如 1、3、5)表示最大值。


在 Java 中使用 PriorityQueue 类和 Collections.reverseOrder() 实现最大堆

我们可以使用 PriorityQueue 类在 Java 中实现堆。该类默认实现了最小堆,我们可以使用 Collections 中的 reverseOrder() 方法来实现最大堆。我们可以使用 peek() 方法来显示堆中根节点的元素。poll() 方法返回并删除根节点的值。我们可以使用 contains() 方法来检查元素是否存在于堆中。

例如,从 java.util 包中导入所有内容。创建一个类 MaxHeap 并编写 main 方法。然后创建一个 PriorityQueue 类的实例作为 pq。使用泛型类型创建 Integer 实例。在创建对象时在括号中写入 Collections.reverseOrder()。使用 add() 方法将四个整数值相加。使用对象 pq 调用 peek() 方法并打印它。然后,在对象上使用 poll() 方法。接下来,使用值 30 作为参数调用 remove() 方法,然后使用 iterator()hasNext() 方法打印数组中的元素。最后,使用带有参数 20contains() 方法。

在下面的示例中,import java.util.* 将导入我们用来创建最大堆的 PriorityQueue 类。我们将值 1234 添加到堆中。peek() 方法返回值 4,这是堆中最大的值。然后,poll() 方法删除了最大数字 4。然后,我们使用 remove() 方法删除数字 3,并将剩余的元素打印在堆中。它打印了值 12,因为我们已经删除了 34。最后,我们使用 contains() 方法检查堆是否包含数字 2。它返回 true,因为堆中存在该数字。因此,我们使用 PriorityQueue 类和 Collectios.reverseOrder() 实现了最大堆。

示例代码:

import java.util.*;

class MaxHeap {
  public static void main(String args[]) {
    PriorityQueue<Integer> pq = new PriorityQueue<Integer>(Collections.reverseOrder());
    pq.add(1);
    pq.add(3);
    pq.add(2);
    pq.add(4);
    System.out.println("The highest value in the heap:" + pq.peek());
    pq.poll();
    pq.remove(3);
    System.out.println("after removing 3:");
    Iterator<Integer> itr = pq.iterator();
    while (itr3.hasNext()) System.out.println(itr.next());
    boolean b = pq.contains(2);
    System.out.println("Does the heap contains 2 ?" + b);
  }
}

输出:

The highest value in the heap:4
after removing 3:
2
1
Does the heap contains 2 ?true

在 Java 中使用 PriorityQueue 类实现最小堆

PriorityQueue 类默认实现最小堆。我们对最小堆应用与对最大堆相同的实现方法。我们使用与 peek()remove()poll()contains() 等相同的方法来执行相同的操作。

在下面的示例中,我们在堆中添加了数字 1234peek() 方法返回根节点中的元素,即 1,如输出所示。我们使用 poll() 方法删除根节点元素 1。我们再次使用 remove() 函数从堆中删除了值 3。删除这些值后,我们的堆只包含元素 24。最后,我们使用 contains() 方法检查堆中的值是否为 3。由于我们已经删除了它,该方法返回一个 false 值。因此,我们使用 PriorityQueue 类实现了一个最小堆。

示例代码:

import java.util.*;

class MinHeap {
  public static void main(String args[]) {
    PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
    pq.add(1);
    pq.add(3);
    pq.add(2);
    pq.add(4);
    System.out.println("The highest value in the heap:" + pq.peek());
    pq.poll();
    pq.remove(3);
    System.out.println("after removing 3:");
    Iterator<Integer> itr = pq.iterator();
    while (itr.hasNext()) System.out.println(itr.next());
    boolean b = pq.contains(3);
    System.out.println("Does the heap contains 3 ?" + b);
  }
}

输出:

The highest value in the heap:1
after removing 3:
2
4
Does the heap contains 2 ?false

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Java 中的类字段和实例字段

发布时间:2023/11/28 浏览次数:97 分类:Java

在本文中,你将学习一些 Java 术语,它们是局部变量、输入参数、类字段和实例字段。我们还将讨论 Java 中实例字段的一些属性。

Java 中的类文件编辑器

发布时间:2023/11/28 浏览次数:192 分类:Java

本文展示了如何使用 Java 类文件来编辑类文件。在本文中,我们将讨论 Java 类文件编辑器,这是一个用 Java 创建的工具,用于编辑 Java 编译的类。我们可以在创建 Java 类后对其进行反编译并查看

Java 中的_JAVA_OPTIONS 环境变量

发布时间:2023/11/28 浏览次数:166 分类:Java

在本文中,我们将讨论 Java 选项和 _JAVA_OPTIONS 环境变量,它的后续 JAVA_TOOL_OPTIONS 和 JDK_JAVA_OPTIONS。

如何在 Java 中清除控制台

发布时间:2023/11/28 浏览次数:125 分类:Java

它展示了在 Java 中清理控制台屏幕的两种方法。在本教程中,我们将看一下在 Java 中清理控制台屏幕的两种方法。我们将通过实例来学习如何在运行时执行 Java 清屏命令。

如何在 Java 中从控制台获取输入

发布时间:2023/11/28 浏览次数:163 分类:Java

本教程展示了 Scanner 类中包含的读取控制台输入的各种功能。在本教程中,我们将查看 Java 中的 Scanner 类,并学习如何使用该类从控制台读取输入。Scanner 类来自于 Java 包 java.util.Scanner。

Java 中的 console.log

发布时间:2023/11/28 浏览次数:174 分类:Java

本文介绍 Java 中的 console.log。本教程介绍 Java 中的 console.log() 函数以及如何在 Java 中将日志显示到控制台。console.log() 是 JavaScript 的一个函数,用于向浏览器控制台显示日志消息。

Java 更改日期格式

发布时间:2023/11/28 浏览次数:166 分类:Java

本文介绍如何在 Java 中更改日期格式 有多种选项可用于将日期字符串转换为日期格式。下面提到的方法可以带来所需的结果。让我们从下面的代码块中了解各种方式。

Java 中 YYYY-MM-DD 格式的日历日期

发布时间:2023/11/28 浏览次数:157 分类:Java

本文讨论了我们可以在 Java 中将日历日期转换为 YYYY-MM-DD 格式的各种方法。Java Date 封装了当前时间和日期。日期类在两个构造函数的帮助下做到这一点 - Date() 和 Date(long millisec) 构造函数。

在 Java 中对枚举类型 switch

发布时间:2023/11/28 浏览次数:75 分类:Java

它解释了在 Java 中使用对枚举类型 switch 两种方法。这篇文章解释了如何在 Java 中对 enum 使用 switch。我们将通过两种方式对 enum 使用 switch 语句。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便