优先队列是允许至少下列两种操作的数据结构:Insert(插入)、DeleterMin(删除最小者)。它的工作室找出、返回、删除优先队列最小的元素。
插入操作等于Enqueue(入队)、而DeteMin则是队列中Dequeue(出队)在优先队列中的等价操作。DeterMin函数也变更它的输入。
二叉堆:结构性、堆序性
堆是一棵被完全填满的二叉树。
一棵高为h的完全二叉树有2h到2h+1-1个节点,这意味着,完全二叉树的高是【logN】,所以它是O(logN).
因为完全二叉树很有规律,所以它可以用一个数组表示而不需要指针。
使操作被快速执行的性质是堆序性。在一个堆中,对于每一个节点X,X的父亲中的关键字小于(等于)X中的关键字。根节点除外(它没有父亲)。
根据堆序性质,最小元总可以在根处找到。
插入(Insert):
为将一个元素X插入到堆中,我们在下一个空闲的位置创建一个空穴,否则该树将不是完全树。如果X可以放在该空穴中而不破坏堆的序,那么插入完成,
否则,我们把空穴的父节点上的元素移入到该空穴,这样,空穴就朝着根的方向上行一步。继续该过程知道X可以放入到空穴中为止。
这种策略叫做上滤。
DeleteMin(删除最小值)
DeleteMin以类似于插入的方式处理。找出最小元是容易的,困难的部分在与删除它。当删除一个最小元时,在根节点处产生一个空穴。由于现在堆缺少了一个元素。
因此堆中最后一个元素X必须移动到该堆的某个地方。如果X可以放到空穴,那么DeteleMin完成。否则我们将空穴的两个儿子中的较小者放入空穴,这样就把空穴
向下推了一层。重复该步骤知道X可以放入空穴。