最小优先队列
总体表述
队列属于容器的一种。
不同于双向链表类容器,可以在容器的任意位置执行元素插入和删除,
队列容器只允许在尾部插入元素,在首部删除元素。
队列属于操作受限的容器。
最小优先队列,属于具备特殊性质的队列。
向队列添加元素时,按优先级确定插入位置。
从队列取元素时,每次取出的均是当前队列具有最小优先级的元素。
接口设计
template
class MinPriorityQueue
{
public:
MinPriorityQueue();
virtual ~MinPriorityQueue();
MinPriorityQueue(const MinPriorityQueue& dqA_);
MinPriorityQueue operator=(const MinPriorityQueue& dqA_);
void In(const T& nValue_);
T Out();
T Peek() const;
bool IsEmpty() const;
Heap::MinHeap GetHeap() const
{
return m_mhHeap;
}
private:
Heap::MinHeap m_mhHeap;
};
实现
构造
template
MinPriorityQueue::MinPriorityQueue()
{
}
拷贝构造
template
MinPriorityQueue::MinPriorityQueue(const MinPriorityQueue& mpqA_)
{
m_mhHeap = mpqA_.m_mhHeap;
}
赋值
template
typename MinPriorityQueue MinPriorityQueue::operator=(const MinPriorityQueue& mpqA_)
{
if (this == &mpqA_)
{
return *this;
}
m_mhHeap = mpqA_.m_mhHeap;
return *this;
}
析构
template
MinPriorityQueue::~MinPriorityQueue()
{
}
入队列
template
void MinPriorityQueue::In(const T& nValue_)
{
m_mhHeap.Add(nValue_);
}
出队列
template
typename T MinPriorityQueue::Out()
{
if (IsEmpty())
{
throw "queue is empty";
}
T _nValue = m_mhHeap.Get(1);
m_mhHeap.Delete(1);
return _nValue;
}
查询队首元素
template
typename T MinPriorityQueue::Peek() const
{
if (IsEmpty())
{
throw "queue is empty";
}
return m_mhHeap.Get(1);
}
时间复杂度
假设队列中元素个数为n
构造
时间复杂度Θ(1)
拷贝构造
时间复杂度Θ(n)
赋值
时间复杂度Θ(n)
析构
时间复杂度Θ(1)
入队列
时间复杂度O(lg(n))
出队列
时间复杂度O(lg(n))
查询队首元素
时间复杂度O(1)