赞
踩
优先队列的时间复杂度?
这个问题主要分为两个部分:优先队列是什么?优先队列的时间复杂度是多少?
优先队列,英文名:Priority Queue。顾名思义,优先队列是一种特殊的队列,普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。
在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。
优先队列是通过堆实现的,通过完全二叉树实现的小顶堆或大顶堆。
详情参考文章:c++优先队列(priority_queue)用法详解
在计算机科学中,堆是一种特殊的基于树的数据结构,满足堆属性:在最大堆中,对于任何给定的节点 C,如果 P 是 C 的父节点,则 P 的键(值)为 大于或等于 C 的键。在最小堆中,P 的键小于或等于 C 的键(值)。位于堆“顶部”的节点(没有父节点)称为根节点。
堆是一种称为优先级队列的抽象数据类型的最有效实现,事实上,优先级队列通常称为“堆”,无论它们如何实现。 在堆中,最高(或最低)优先级的元素始终存储在根中。 然而,堆不是排序结构; 它可以被认为是部分有序的。 当需要重复删除具有最高(或最低)优先级的对象时,或者当插入需要与根节点的删除穿插时,堆是一种有用的数据结构。
堆的常见实现是二叉堆,其中树是完全二叉树,如图所示。 当堆是完全二叉树时,它具有尽可能小的高度——具有 N 个节点且每个节点都有分支的堆的高度始终为 log2N。
优先队列用堆实现,只是需要构建初始堆,这个时间复杂度是O(n);插入和删除只是修改了堆顶和堆底,不需要所有节点都排序,只是需要再次调整好堆。
push | pop | top | empty |
---|---|---|---|
O(log2n) | O(log2n) | O(1) | O(1) |
因此,优先队列的时间复杂度为 O(log2n)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。