前言
各位同学大家候,时隔数月未更博,为了表示依然健在,出来冒个泡。
正巧,最近刚好在项目中,用到了优先队列的数据结构,趁热给大家分享一下,同时帮自己理一下。
废话少说,来互相伤害吧!
介绍
首先,关于优先队列,下面做一个简单的介绍。
什么是优先队列?
优先队列是一种数据结构,用于处理将数据插入队列中,每次能够快速、高效的取出最大元素的数据机构。
可以用下方表格简单介绍:
获取元素 特点
队列 最新的元素 先进后出
栈 最老的元素 先进先出
优先队列 最大的元素 插入新元素时排序为什么需要使用优先队列?
优先队列主要提供两个函数:插入和删除并获得最大元素。
那有同学会问了:那这跟数列进行排序之后,获取最大值有什么区别呢?
优先队列的优势就是:【部分排序】。它可以对数组进行部分排序,同时保证最大的值放到数组的第一个位置(实际上是第二个位置,也就是下标1,后面将会解释)。
换句话说,就是能减少排序的比较次数,同时能够保证拿到最大的元素。优先队列的使用场景。
电脑中的每个进程的优先级不同,而电脑进程的执行顺序是从高到低,此时获取最高优先级的进程可以用到优先队列;
Android手机中,系统给电话、短信的优先级,一般比非系统级App(游戏等)的优先级高。如何实现一个优先队列?
优先队列的内部构成方式有多种,分别有:数组(无序)、数组(有序)和链表的方式。
优先队列提供的主要功能有两个:【插入元素】和【删除最大元素】。那么使用上面几种方式,有哪些不同点呢?
下方我们用一个表格进行简单的说明:
插入元素 运行时间的增长数量级(最坏情况) 删除最大元素 增长数量级
数组(有序) 插入时进行排序 N 取第一个或最后一个元素 1
数组(无序) 插入时不进行排序 1 使用排序算法查找最大元素 N
关于链表,与数组一样,要么就在插入时排序,要么就在去除最大元素时使用排序算法查找最大元素。
由上方表图可以看出