【java】优先队列问题2018-9-25

本文介绍了优先队列的概念,包括最大优先队列和最小优先队列,并指出其不遵循先入先出原则。优先队列入队和出队的时间复杂度通过二叉堆实现为logn。文章通过代码展示了如何使用二叉堆实现最大优先队列,包括入队和出队操作,并提及了数组resize的情况。
摘要由CSDN通过智能技术生成

什么是优先队列?

提到优先队列我们首先想到的就是队列这个数据结构

队列的特点是什么?

先进先出(FIFO)

入队列:

在这里插入图片描述

出队列:

在这里插入图片描述

那么,优先队列又是什么样子呢?

优先队列不再遵循先入先出的原则,而是分为两种情况:

最大优先队列,无论入队顺序,当前最大的元素优先出队。

最小优先队列,无论入队顺序,当前最小的元素优先出队。

比如有一个最大优先队列,它的最大元素是8,那么虽然元素8并不是队首元素,但出队的时候仍然让元素8首先出队:

在这里插入图片描述
让我们回顾一下二叉堆的特性:

1.最大堆的堆顶是整个堆中的最大元素

2.最小堆的堆顶是整个堆中的最小元素

因此,我们可以用最大堆来实现最大优先队列,每一次入队操作就是堆的插入操作,每一次出队操作就是删除堆顶节点。

入队操作:

1.插入新节点5

在这里插入图片描述

2.新节点5上浮到合适位置。

在这里插入图片描述

出队操作:

1.把原堆顶节点10“出队”

在这里插入图片描述
2.最后一个节点1替换到堆顶位置

在这里插入图片描述

3.节点1下沉,节点9成为新堆顶
在这里插入图片描述

二叉堆节点上浮和下浮的时间复杂度都是logn,所以优先队列入队和出队的时间复杂度也都是logn!

代码实现

import java.util.Arrays;

public class PriorityQueue {
    
	private int[] array;
    private int size;
    public PriorityQueue() {
    
		// 队列初始长度32
		array = new int[32];
	}
    
    /**
     * 入队
     * @param key  入队元素
     */
	private void enQueue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值