图解数据结构(09) -- 优先队列

本文详细介绍了优先队列的概念,包括最大优先队列和最小优先队列,强调其与普通队列的区别。通过二叉堆的特性,解释了如何使用最大堆实现最大优先队列,以及入队、出队操作的时间复杂度。同时,概述了树、二叉树以及二叉堆的相关知识,为理解优先队列提供了基础。
摘要由CSDN通过智能技术生成

1、优先队列的特点

队列 的特点是 先进先出, 入队列,将新元素置于队尾:
在这里插入图片描述
出队列,队头元素最先被移出:
在这里插入图片描述
优先队列不再遵循先入先出的原则,而是分为两种情况:

  • 最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队
  • 最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队

例:
有一个最大优先队列,其中的最大元素是8,那么虽然8并不是队头元素,
但出队时仍然让元素8首先出队
在这里插入图片描述

2、优先队列的实现

二叉堆的特性:

  • 最大堆的堆顶是整个堆中的最大元素
  • 最小堆的堆顶是整个堆中的最小元素

可以用最大堆来实现最大优先队列:
每一次 入队 操作就是堆的 插入 操作;
每一次 出队 操作就是删除堆顶节点
入队操作 步骤如下:

  • 插入新节点5
    在这里插入图片描述
  • 新节点5“上浮”到合适位置
    在这里插入图片描述
    出队操作 步骤如下:
  • 让原堆顶节点10出队
    在这里插入图片描述
  • 把最后一个节点1替换到堆顶位置
    在这里插入图片描述
  • 节点1“下沉”,节点9成为新堆顶
    在这里插入图片描述
    二叉堆节点“上浮”和“下沉”的时间复杂度都是 O(logn)
    所以优先队列入队和出队的时间复杂度也是 O(logn)

3、优先队列的代码实现

采用数组来存储二叉堆的元素,当元素数量超过数组长度时,需要进行扩容来扩大数组长度

import java.util.Arrays;

//构建队列
public class TreeNode4 {
   
    private int[] array;
    private  int size;
    public TreeNode4(){
   
        //队列初始长度为32
        array = new int[32];
    }

    /**
     * “入队”操作
     * @param key  入队元素
     */
    public void enQueue(int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值