Java数据结构之堆(优先队列)的实现

Java 数据结构之堆(优先队列)的实现

什么是堆(优先队列)

堆(Heap)是一种数据结构,使用数组实现。堆分为小根堆和大根堆,大根堆满足父节点值大于子节点,小根堆则相反。堆通常被用来实现优先队列(Priority Queue)。

优先队列(Priority Queue)是一个能够让用户迅速查找到队列中最小值(或最大值)的抽象数据类型(ADT)。优先队列通常用堆来实现。

在Java中,堆的实现主要有两种方式:一种是使用Collections的PriorityQueue,一种是手动实现堆。

java.util.PriorityQueue实现

Java中自带的PriorityQueue是一种实现了优先队列的数据结构,底层是一个小根堆。它的具体实现是数组,也可以用数组表达式来看待这个堆 。Java中的PriorityQueue提供了数据结构基本操作的方法:插入、删除、获取队首元素、堆大小等。

下面是Java实现PriorityQueue的示例代码:

import java.util.PriorityQueue;
public class Main {
    public static void main(String[] args) {
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        pq.add(3);
        pq.add(1);
        pq.add(2);
        System.out.println(pq);
        System.out.println(pq.poll());
        System.out.println(pq.poll());
        System.out.println(pq.poll());
    }
}

输出结果:

[1, 3, 2]
1
2
3

上面的示例代码首先创建了一个PriorityQueue对象pq,然后通过add()方法插入元素。最后三个poll()方法依次弹出元素。这里需要注意的是,PriorityQueue是小根堆,poll()方法会弹出堆中的最小元素。

手动实现堆

手动实现堆的方式在工程实践中不常用,但是可以增加对堆的深刻理解。

下面是手动实现堆的示例代码:

public class Heap {
    private int[] heap;
    private int size;
    private int maxSize;

    public Heap(int maxSize) {
        this.maxSize = maxSize;
        this.size = 0;
        this.heap = new int[this.maxSize + 1];
        this.heap[0] = Integer.MIN_VALUE;
    }

    private int parent(int i) {
        return i / 2;
    }

    private int leftChild(int i) {
        return i * 2;
    }

    private int rightChild(int i) {
        return (i * 2) + 1;
    }

    private boolean isLeaf(int i) {
        if (i > size / 2 && i <= size) {
            return true;
        }
        return false;
    }

    private void swap(int i, int j) {
        int temp = this.heap[i];
        this.heap[i] = this.heap[j];
        this.heap[j] = temp;
    }

    public void insert(int element) {
        if (size >= maxSize) {
            return;
        }
        this.heap[++size] = element;
        int current = size;
        while (this.heap[current] < this.heap[parent(current)]) {
            swap(current, parent(current));
            current = parent(current);
        }
    }

    public int remove() {
        int popped = this.heap[1];
        this.heap[1] = this.heap[size--];
        heapify(1);
        return popped;
    }

    public void heapify(int i) {
        if (!isLeaf(i)) {
            if (this.heap[i] > this.heap[leftChild(i)] || this.heap[i] > this.heap[rightChild(i)]) {
                if (this.heap[leftChild(i)] < this.heap[rightChild(i)]) {
                    swap(i, leftChild(i));
                    heapify(leftChild(i));
                } else {
                    swap(i, rightChild(i));
                    heapify(rightChild(i));
                }
            }
        }
    }

    public void print() {
        for (int i = 1; i <= size / 2; i++) {
            System.out.print(" PARENT : " + heap[i] + " LEFT CHILD : " + heap[2 * i]
                    + " RIGHT CHILD :" + heap[2 * i + 1]);
            System.out.println();
        }
    }

    public static void main(String[] args) {
        Heap Heap = new Heap(15);
        Heap.insert(5);
        Heap.insert(3);
        Heap.insert(17);
        Heap.insert(10);
        Heap.insert(84);
        Heap.insert(19);
        Heap.insert(6);
        Heap.insert(22);
        Heap.insert(9);

        Heap.print();

        System.out.println("The Min val is " + Heap.remove());
    }
}

输出结果:

 PARENT : 3 LEFT CHILD : 5 RIGHT CHILD :17
 PARENT : 5 LEFT CHILD : 10 RIGHT CHILD :84
 PARENT : 17 LEFT CHILD : 6 RIGHT CHILD :19
 PARENT : 10 LEFT CHILD : 22 RIGHT CHILD :9
The Min val is 3

上面的代码实现了手动创建堆和一些基本操作的方法,例如:insert()、remove()、heapify()以及print()操作。我们可以看到,输出的结果是小根堆的形式,remove()方法会返回堆中的最小元素。

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

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

相关文章

  • Halcon软件安装与界面简介

      1. 下载Halcon17版本到到本地 2. 双击安装包后 3. 步骤如下     界面分为四大块 1.    Halcon的五个助手 1)    图像采集助手:与相机连接,设定相机参数,采集图像 2)    标定助手:九点标定或是其它的标定,生成标定文件及内参外参,可以将像素单位转换为长度单位 3)    模板匹配助手:画取你想寻找的图像,设定参数,可…

    算法与数据结构 2023年4月19日
    00
  • JavaScript 处理树数据结构的方法示例

    下面是“JavaScript 处理树数据结构的方法示例”的完整攻略。 什么是树数据结构 树形数据结构是一种非常重要的数据结构,常被用于模拟现实中大量的层级结构。例如:文件目录、网站导航等。其是由一个根节点和若干个子节点构成的,每个节点可以有0个或多个子节点。 使用 JavaScript 处理树形数据结构 了解了树形数据结构后,我们可以使用 JavaScrip…

    数据结构 2023年5月17日
    00
  • C语言实现学生信息管理系统(链表)

    C语言实现学生信息管理系统(链表) 简介 学生信息管理系统是管理学生的一种系统,可以实现添加、查找、删除和修改学生信息等功能。本文将使用C语言实现学生信息管理系统,并通过链表的方式进行实现。 前提条件 在开始之前,我们需要了解如下内容: C语言基础知识 链表的基本概念和使用 系统架构 学生信息管理系统主要包含以下几个模块: 学生信息结构体 添加学生信息 查找…

    数据结构 2023年5月17日
    00
  • Python数据结构之双向链表详解

    Python数据结构之双向链表详解 什么是双向链表? 在计算机科学中,双向链表是链表的一种,每个结点除了储存下一个结点的指针外,还储存着前一个结点的指针。这个“前进”指针被称为“ next指针”,而“后退”指针被称为“previous指针”。 双向链表和单向链表的区别在于,单向链表的每个结点只储存一个指向下一个结点的指针,而双向链表储存了前一个和后一个结点的…

    数据结构 2023年5月17日
    00
  • 详解Java实现数据结构之并查集

    详解Java实现数据结构之并查集 简介 并查集是一种基于树型结构的数据结构,主要用于解决一些不交集问题。它支持两个操作: 合并两个元素所在的集合 判断两个元素是否在同一个集合中 在并查集中,每个节点都有一个指向其父节点的指针。如果一个节点的指针指向它本身,说明它是一个集合的根节点。 实现 我们用一个int类型的数组parent来表示每个节点的父节点。初始时,…

    数据结构 2023年5月17日
    00
  • Java数据结构之最小堆和最大堆的原理及实现详解

    Java数据结构之最小堆和最大堆的原理及实现详解 什么是堆? 堆是一种特殊的树形数据结构,它满足以下两个条件: 堆是一个完全二叉树,即除了最后一层,其他层都必须填满,最后一层从左到右填满 堆中每个节点的值必须满足某种特定的条件,例如最小堆要求每个节点的值都小于等于其子节点的值。 堆一般分为两种类型:最小堆和最大堆。 最小堆:每个节点的值都小于等于其子节点的值…

    数据结构 2023年5月17日
    00
  • Java数据结构之常见排序算法(下)

    Java数据结构之常见排序算法(下) 前言 这是 Java 数据结构之常见排序算法的第二篇,本篇文章将继续介绍常见的排序算法。对于尚未了解基本排序算法的读者,可以先阅读 Java 数据结构之常见排序算法(上)。 快速排序 快速排序是一种使用分治思想的排序算法,其思路是将一个数组分为两个子数组,再对子数组进行排序,这个过程不断递归执行。在具体实现时,选择一个元…

    数据结构 2023年5月17日
    00
  • 手动实现数据结构-栈结构

    1.栈结构 是一种受限的线性结构。 特点:先进后出 2.使用TS实现 1 //封装一个栈 使用泛型类 2 class ArrayStack<T=any>{//给一个默认值为any类型 3 //定义一个数组,用于存储元素 4 private data:T[]=[] 5 //push:将元素压入栈中 6 push(e:T):void{ 7 this.…

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