数据结构 第六章(堆)PPT教学课件
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/12/10
9
前述插入过程如下所示:
2020/12/10
10
函数Insert实现了最大堆插入操作:
template <class Type>
void MaxHeap<Type>::Insert ( const Element<Type>&x ) {
// 将元素x 插入最大堆
if (n == MaxSize ) { HeapFull( ); return;}
• 链表结构,插入操作可在表的前端完成,其时 间为O(1)。删除操作的时间仍然为O(n)。
• 有序线性表
• 元素按优先级非递增次序排列,每次删除操作 的时间为O(1),但每次插入操作的时间为O(n)。
2020/12/10
3
有没有其他更好的方式?
树!
为什么?
O(logm n)
定义:最大树是一棵树,其中每个结点的key值不 小于该结点子女(如果存在的话)的key值
MaxHeap (int sz = DefaultSize ); // 创建空堆 Boolean IsFull ( ); // 判断堆中元素个数是否达到最大容量 void Insert (Element<Type>& item); Boolean IsEmpty ( ); // 判断堆中元素个数是否为0 Element<Type>* Delete(Element<Type>& x ); };
n++;
for (int i = n; i > 1;) { // i==1表示已到达根结点
if (x.key <= heap[i/2].key) // 新元素的关键字不大
break;
// 于结点i双亲元素的关键字
heap[i] = heap[i/2]; // 将双亲结点的元素移到结点i中
i/=2;
// i继续向上
}
heap[i] = x;
}
2020/12/10
11
分析:
插入过程从完全二叉树的叶结点开始,并向上移 动,最坏情况下到根为止 在此路径上每一个结点的处理时间是O(1) n个结点的完全二叉树的高度为log2(n+1) 插入函数的for循环最多迭代O(log n)次
插入函数的时间复杂性是O(log n)
2020/12/10
7
由于最大堆是一棵完全二叉树,所以可用数组 heap表示:
private:
Element<Type> *heap;
int n;
// 最大堆的当前元素个数
int MaxSize;
// 堆中可容纳元素的最大个数
MaxHeap的构造函数如程序如下:
MaxHeap::MaxHeap (int sz = DefaultSize ) { MaxSize = sz; n = 0; heap = new Element<Type>[MaxSize+1]; // heap[0] 不用
DeleteMax(Element<Type>&x) {// 从最大堆中删除元素
if (!n) { HeapEmpty( ); return 0;}
x = heap[1]; Element<Type> k = heap[n]; n--;
for (int i = 1, j = 2; j <= n;) { // j是i的子女
}
2020/12/10
8
插入操作
最大堆的结点个数为n,插入一个新元素时 为了保持完全二叉树性质,新增结点的编号应为 ✓i = n + 1 为了保持最大树性质,还需 ✓要比较结点i和其双亲的key值 ➢如果结点i的key值大于其双亲的key值 ➢将结点i中的元素与其双亲的元素对换 ➢令结点i的双亲成为新的结点i,继续向上 比较 ➢直到结点i的key值不大于其双亲的key值 或i到达根结点为止。
最大堆既是一棵完全二叉树,又是一棵最大树
2020/12/10
4
最大堆的例子:
2020/12/10
5
最大堆的基本操作: (1) 创建空堆 (2) 将新元素插入堆中 (3) 从堆中删除key值最大的元素
2020/12/10
6
最大堆的ADT定义如下:
template <class Type> class MaxHeap: public MaxPQ <Type> { // 对象:由n≥0个元素构成的完全二叉树和最大树 public:
if (j < n) if (heap[j].key < heap[j+1].key)
j++;
if (k.key >= heap[j].key)
break;
heap[i] = heap[j]; // 将较大子女的元素移到结点i中
i = j; j *= 2;
Байду номын сангаас
// i继续向下
}
heap[i] = k;
return &x;
✓令结点i的较大子女成为新的结点i,继续向下
比较
✓直到结点i的key值不小于其较大子女的key值或
i到达叶结点为止
2020/12/10
13
删除过程如下所示:
2020/12/10
14
最大堆删除操作:
template <class Type>
Element<Type>* MaxHeap<Type>::
堆
2020/12/10
1
优先队列
问题的提出: 日常工作安排 计算机操作系统任务调度
最大优先队列!
性质:
被删除的是优先级最高的元素
任何时刻可插入任意优先级的元素
最小优先队列
2020/12/10
2
假设队列有n个元素,最大优先队列的存储结构:
• 无序线性表
• 顺序映射,插入操作很容易在表的尾端完成, 其时间为O(1)。删除操作需要查找优先级最高 的元素并删除之,需要O(n)时间
2020/12/10
12
删除操作
从最大堆中删除一个元素时,该元素必定在?
根结点(结点1)中
为了保持完全二叉树性质
✓将结点n中的元素暂时存放在结点i = 1中,最大
堆的元素个数变为n – 1。
为了保持最大树性质
✓比较结点i和其较大子女的key值
✓若结点i的key值小于其较大子女的key值
✓将结点i中的元素与其较大子女的元素对换
}
2020/12/10
15
PPT教学课件
谢谢观看
Thank You For Watching
2020/12/10