优先队列

✍ dations ◷ 2025-11-26 21:24:05 #数据结构

优先队列是计算机科学中的一类抽象数据类型。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列往往用堆来实现。

优先队列至少需要支持下述操作:

其它可选的操作:

有许多简单低效的实现。如用一个有序的数组;或使用无序数组,在每次取出时搜索全集合,这种方法插入的效率为O(1),但取出时效率为​O(n)。

出于性能考虑,优先队列用堆来实现,具有(log )时间复杂度的插入元素性能,()的初始化构造的时间复杂度。如果使用自平衡二叉查找树,插入与删除的时间复杂度为(log ),构造二叉树的时间复杂度为( log )。

从计算复杂度的角度,优先级队列等价于排序算法。

有一些特殊的堆为优先队列的实现提供了额外的性能:二叉堆的插入与提取操作的时间复杂度为(log ),并可以常量时间复杂度的peek操作。二项堆提供了几种额外操作。斐波那契堆的插入、提取、修改元素优先级等操作具有分摊常量时间复杂度,,但删除操作的时间复杂度为(log )。Brodal queue(英语:Brodal queue)具有最糟糕情况下的常量复杂度但算法相当复杂因而不具有实用性。

对于整型、浮点型等具有有限值域的元素的数据类型,优先队列有更快的实现。

优先队列是计算机科学中的一类"容器数据类型"。

标准模板库(STL)以及1998年的C++标准确定优先队列是标准模板库的容器适配器模板。其实现了一个需要三个参数的最大优先队列:比较函数(缺省情况是小于函数less<T>)、存储数据所用的容器类型(缺省情况是向量vector<T>)以及指向序列开始和结束位置的两个迭代器。和标准模板库中其他的真实容器不同,优先队列不允许使用其元素类型的迭代器,而必须使用优先队列抽象数据类型的迭代器。标准模板库还实现了支持随机访问数据容器的优先队列--二叉最大堆。Boost C++库也在其中实现了堆结构。

Python的heapq模块实现了在链表基础上的二叉最小堆,queue模块将heapq模块包装实现了PriorityQueue类。

Java库中的PriorityQueue类实现了最小优先队列。

Go库中的container/heap模块实现了一个可以在任何兼容数据结构上构建的最小堆。

PHP标准库包括了一个优先队列SplPriorityQueue。

苹果的Core Foundation框架包括了一个最小堆结构CFBinaryHeap。

优先队列常用于操作系统的任务调度,也是贪心算法的重要组成部分。

相关

  • 类二类二
  • 白色人种白人(英语:White people),或称白色人种,指狭义的高加索人种(一般亦作西洋人、西方人或西人、洋人),是以人类肤色命名的人种名称,一般指拥有淡色皮肤的种族或群体;或是一类拥有淡色皮肤
  • 半兽人半兽人(英语:Orc、Ork),或译作兽人,或直译为奥克、欧克,是奇幻文学作品当中的一个虚构生物或种族。关于Orc一词的来源,有说法是Orc/Ork(半兽人)由拉丁文Orcus——一位神祇的称号“阴
  • 天王星天王星的大气层虽然还是以氢和氦为主要的成分,但与海王星相似,而不同于较大的气体巨星木星和土星,它拥有的挥发性物质(类似于"冰"),像是水、氨和甲烷的比例较高。不同于木星和土星
  • 满族传统命名满族人名是指满族人的姓名。从女真时代至现代,经历了数百年间的巨变。满人在传统上使用满语人名。满语人名可能因年代久远,大多数都难以找到定义。一些学者试图对其进行分类。
  • 天主教双王天主教双王(西班牙语:Reyes Católicos)是卡斯蒂利亚女王伊莎贝拉一世和阿拉贡国王费尔南多二世夫妻二人的合用头衔。1469年10月19日二人于瓦拉多利德完婚,伊莎贝拉时年18岁,斐迪
  • 进行性肌萎缩症进行性肌萎缩(Progressive Muscular Atrophy,P.M.A)是一种具有进行性、对称性、以近端为主的弛缓性瘫痪和肌肉萎缩为特征的遗传性下运动神经元疾病。确切原因仍不清楚。有人记
  • 太鼓和太鼓(わだいこ),日本传统打击乐器的总称,其中,乐大鼓和打大鼓用来日本雅乐的演奏。知名游戏《太鼓达人》系列之主角和田咚,即为在北陆的某个太鼓工房中,一个灵魂寄居的红色和太鼓
  • 杨守谦杨守谦(1505年-1550年),字允亨,号次村,直隶彭城卫(今江苏省徐州市)人,明朝政治人物,官至兵部左侍郎。杨志学之子。嘉靖八年(1529年)登进士,授工部屯田司主事,历兵部职方司郎中。出任陕西按
  • 奇金 (阿拉斯加州)坐标:64°4′15″N 141°52′30″W / 64.07083°N 141.87500°W / 64.07083; -141.87500奇金(英语:Chicken)是美国阿拉斯加州东南费尔班克斯普查区的一个普查规定居民点。该地是