算法导论--第六章学习笔记
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:很遗憾该博客不支持图片,所以读者最好还是看看书上的图,便于理解
第六章介绍的是堆排序,本章讲了以下几个内容:
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:很遗憾该博客不支持图片,所以读者最好还是看看书上的图,便于理解
相关文章推荐
- 算法导论学习笔记 (页码:9 ~ 16)
- 【算法导论学习笔记】最大子数组问题
- 算法导论学习笔记-第十一章-散列表
- 算法导论课——动态规划学习笔记
- 算法导论学习笔记——第8章 线性时间排序
- Introduction to Algorithms 算法导论 第4章 递归式 学习笔记及习题解答
- 【算法导论】学习笔记——第8章 线性时间排序
- 一个菜鸟的算法导论学习笔记【Introsuction&Chapter 1】
- 算法导论学习笔记(15)——用于不相交集合的数据结构
- Introduction to Algorithms 算法导论 第1章 基础知识 学习笔记及习题解答
- 算法导论--学习笔记01
- 算法导论学习笔记(十三):动态规划(三):01背包问题
- 动态规划(算法导论学习笔记)
- 算法导论学习笔记-第二十章-斐波那契堆
- 算法导论--学习笔记02
- 算法导论学习笔记 一 分治算法
- 基础知识 第一部分 算法导论 学习笔记
- 算法导论 学习笔记。
- 算法导论学习笔记——插入排序