您的位置:首页 > 其它

算法导论--第六章学习笔记

2011-07-30 19:42 204 查看
从第六章开始,我们开始了第二部分排序和排序统计学的学习。

第六章介绍的是堆排序,本章讲了以下几个内容:

1、介绍堆的概念,以最大堆为例

2、保持堆性质的算法MAX-HEAPIFY

3、建堆的算法BUILD-MAX-HEAP

4、堆排序算法HEAPSORT

5、优先级队列

1、堆

定义:(二叉)堆数据结构是一种数组对象,它可以被视为一棵完全二叉树。树中每个结点与数组中存放该结点值的那个元素对应。树中每层都是满的(最后一层可能除外,所以它才可以被视为完整二叉树)。

表示堆的数组A是一个具有两个属性的对象:length[A]是数组中的元素,heap-size[A]是存放在A中的堆的元素的个数。即A[1….length-size[A]]属于相应的堆,在其后就不属于堆了,但只要不到A[length[A]],对数组来说,仍是有效值

堆与树的简单比较

高度:

1、堆的高度是本节点到叶子节点的最长简单路径上边数目,即从叶往上算

2、树的高度是从根往下到该结点

3、堆与树的高度均为Θ(lgn)。

2、保持堆的性质

MAX-HEAPIFY算法,保持最大根性质的关键。伪代码如下:

MAX-HEAPIFY(A,i)

l ←left(i)

r ←right(i)

if l≤heap-size[A] and A[l]>A[i]

then largest ←l

else largest ←i

if l≤heap-size[A] and A[r]>A[largest]

then largest ←r

if largest≠i

then 交换A[i]与A[largest]

MAX-HEAPIFY(A,largest)

运行时间T(n) ≤T(2n/3)+ Θ(1)

Tn=O(lgn)=O(h).

3、建堆

我们可以自底向上地调用MAX-HEAPIFY来将一个数组变成最大堆

BUILD-MAX-HEAP(A)

heap-size[A] ←length[A]

for i←length[A]/2 到1 //开始自底向上,从倒数第二层最右端

do MAX-HEAPIFY(A,i)

运行时间:

每次调用MAX-HEAPIFY时间为O(lgn),共调用O(n)次,故时间为O(nlgn)

4、堆排序算法

开始时,堆排序算法先用BUILD-MAX-HEAP将数组构成一个最大堆,然后根结点与A
互换位置。不断重复该过程,直至堆的大小变为2

HEAP-SORT(A)

BUILD-MAX-HEAP(A)

for I ←length[A] 直到2

do 交换A[i]与A[i]

heap-size[A] ←heap-size[A]-1

MAX-HEAPIFY(A,1)

运行时间为O(nlgn)

其中调用BUILD-MAX-HEAP的时间为O(nlgn)(笔者认为书中的O(n)有误,)n-1次HEAP-MAX-HEAPIFY调用中每次的时间代价为O(lgn)

5、堆的应用:优先级队列

定义:是一种用来维护由一组元素构成的集合S的数据结构,这一组元素中的每个都有关键字key。支持以下操作:

1、队列的最大关键字的元素

HEAP-MAXMUM(A)

return A[1]

运行时间:Θ(1)

2、去掉并返回最大关键字的元素

EXTRACT-MAX(A)

if heap-size[A]<1

then error”堆下溢”

max← A[1]

A[1] ←A[heap-size[A]]

heap-size[A] ←heap-size[A]-1

MAX-HEAPIFY(A,1) //主要把时间花在这里

Return max

运行时间:O(lgn)

3、将元素的关键字值增加到k,k值不能小于x原来关键字值

Increase(A,i,key)

if key<A[i]

then error”出入关键字值太小”

A[i] ←key

While i>1 andA[parent(i)]<A[i]//移动过程不断与其父母比

Do 交换A[i]与A[parent(i)]

i←parent(i)

运行时间:O(lgn)

4、在堆中插入新元素

首先是要加入一个关键字值为-∞的叶子结点来扩展堆

Insert(A,key)

heap-size[A] ←heap-size[A]+1

heap-size[A] ←负无穷

Increase(A, heap-size[A],key)

运行时间:O(lgn)

总结:

最大堆其实就是一个类似于递减数列

优先级的去值、加值、插值运行时间都是O(lgn)

PS:很遗憾该博客不支持图片,所以读者最好还是看看书上的图,便于理解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: