博客
关于我
(恋上数据结构笔记):优先级队列(Priority Queue)
阅读量:341 次
发布时间:2019-03-04

本文共 2388 字,大约阅读时间需要 7 分钟。

优先级队列(Priority Queue)技术解析

目录

  • 优先级队列概述
  • 优先级队列的接口定义
  • 优先级队列的应用场景
  • 优先队列的底层实现

  • 优先级队列概述

    优先级队列是一种能够根据元素的优先级进行操作的数据结构,常用于任务调度、事件处理等场景。与普通队列不同,优先级队列能够自动根据元素的优先级决定元素的入队和出队顺序。


    优先级队列的接口定义

    优先级队列的接口通常包括以下几个核心方法:

    • size():返回队列的元素数量。
    • isEmpty():判断队列是否为空。
    • enQueue(E element):将元素入队。
    • deQueue():从队列头部取出元素。
    • front():获取队列的首元素。
    • clear():清空队列。

    优先级队列的应用场景

    优先级队列广泛应用于以下场景:

    1. 医院的夜间门诊

    • 队列元素:患者
    • 优先级依据:病情严重程度、挂号时间

    2. 操作系统的多任务调度

    • 队列元素:任务
    • 优先级依据:任务类型、执行优先级

    通过优先级队列,可以确保任务或患者的处理顺序符合预定规则,提升整体效率。


    优先队列的底层实现

    优先级队列的底层通常采用二叉堆(Binary Heap)实现,因为二叉堆能够在O(log n)时间复杂度内完成插入、删除和查找操作。

    实现原理

    • 二叉堆通过数组存储数据,父节点总是位于子节点的左侧。
    • 根据比较器(Comparator)或可比较对象(Comparable),确定元素的优先级。
    • 每次从堆顶取出具有最高优先级的元素。

    优先级队列代码示例

    以下是优先级队列的实现代码:

    public class PriorityQueue
    { private BinaryHeap
    heap; public PriorityQueue(Comparator
    comparator) { heap = new BinaryHeap<>(comparator); } public PriorityQueue() { this(null); } public int size() { return heap.size(); } public boolean isEmpty() { return heap.isEmpty(); } public void clear() { heap.clear(); } public void enQueue(E element) { heap.add(element); } public E deQueue() { return heap.remove(); } public E front() { return heap.get(); }}

    测试代码示例

    以下是优先级队列的使用示例:

    public class Person implements Comparable
    { private String name; private int boneBreak; public Person(String name, int boneBreak) { this.name = name; this.boneBreak = boneBreak; } @Override public int compareTo(Person person) { return this.boneBreak - person.boneBreak; } @Override public String toString() { return "Person [name=" + name + ", boneBreak=" + boneBreak + "]"; }}public class Main { public static void main(String[] args) { PriorityQueue
    queue = new PriorityQueue<>(); queue.enQueue(new Person("Jack", 2)); queue.enQueue(new Person("Rose", 10)); queue.enQueue(new Person("Jake", 5)); queue.enQueue(new Person("James", 15)); while (!queue.isEmpty()) { System.out.println(queue.deQueue()); } }}

    输出结果

    程序运行后会输出以下内容:

    Person [name=James, boneBreak=15]  Person [name=Rose, boneBreak=10]  Person [name=Jake, boneBreak=5]  Person [name=Jack, boneBreak=2]

    通过以上内容,可以看出优先级队列在实际应用中的高效性和灵活性,同时也展示了如何通过二叉堆实现优先级队列的底层逻辑。

    转载地址:http://efyr.baihongyu.com/

    你可能感兴趣的文章
    tablayout 滑动监听
    查看>>
    ViewModel LiveData 使用初体验
    查看>>
    Error connecting to the service protoco
    查看>>
    windows 用户获取管理员权限
    查看>>
    Flutter 加载本地图片
    查看>>
    android带气泡的第三方选项卡
    查看>>
    好玩的editText
    查看>>
    自动安装服务2
    查看>>
    edittext弹出键盘或者隐藏键盘
    查看>>
    viewpager的setOffscreenPageLimit方法有什么作用
    查看>>
    基类去掉标题栏
    查看>>
    使用DatagramSocket发送、接收数据(Socket之UDP套接字)
    查看>>
    android用视频当做背景
    查看>>
    android 用action拦截打电话界面
    查看>>
    Android设置某个窗口常亮和最大亮度
    查看>>
    【已解决】Android Studio下,gradle project sync failed 错误
    查看>>
    打包命名
    查看>>
    Android SDK 与API版本对应关系
    查看>>
    实现谣传QQ中的手段——“1像素页面保活”
    查看>>
    Android UI效果篇-(3)用属性动画实现收缩菜单
    查看>>