堆(heap)

一. 优先队列(Priority query)

1.优先队列:特殊的队列,取出元素的顺序是按照优先权大小,而不是元素进入队列的先后顺序。

2.如何实现优先队列呢?

    优先队列最重要的两个操作就是插入任意一个元素和删除最大值

    (1)最初考虑使用有序数组或有序链表,但数组插入元素的时间复杂度是o(n),链表寻找位置的时间复杂度是o(n),两者总不能达到令人满意的时间复杂度。

    (2)考虑用二叉搜索树,插入和删除的时间复杂度都是树的高度(log2n),但是由于删除最大值操作是在树的某一端进行,所以会导致树变斜了,树的高度不再是log2n

    (3)考虑用一种特殊完全二叉树,其中根节点是最大值,这样删除操作总是在根节点进行,这种特殊的完全二叉树就是堆

二.堆(heap)

1.两个特性:(1)结构性:用数组表示的完全二叉树

                    (2)有序性:任一结点的值是其子树所节点的最大值(或最小值)

2.最大堆的删除:最大堆的删除,总是从堆的根节点删除元素,根节点被删除后,很显然不再是一颗完全二叉树而是变成了两棵树,这是就需要移动某个结点充当根结点(移动该结点后应该保证该树仍然是一棵完全二叉树),这时实现了堆的结构性,但不能保证堆的有序性,需要把根元素做下沉处理

3.最大堆的创建:将n个元素顺序放入二叉树中形成一个完全二叉树,然后利用最大堆的各个子树都是最大堆,先把最小子树转换成最大堆,然后依次转换它的父节点对应的子树,直到根结点(调整方法根上面的删除最大堆类似---下沉)



猜你喜欢

转载自blog.csdn.net/qq_34645958/article/details/80723575