数据结构与算法分析C语言描述 总结笔记 第六章

第六章 优先队列(堆)

1. 基本概念

一种特殊的队列,至少支持两种操作:Insert和DeleteMin;前者插入元素,相当于队列的enqueue,后者查找、删除、返回最小的元素,相当于队列的dequeue。

2. 二叉堆

概念

具有结构性质和堆序性质的二叉树(或者说具有堆序性质的完全二叉树)

性质

  • 结构性质:完全二叉树
  • 堆序性质:父节点小于任意子节点

实现方法

数组即可, 鉴于其完全二叉树的性质,乘以2可以到达左子节点,除以2可以到达父节点。

操作及其时间复杂度:(后面四种操作需要节点位置信息为基础)

  • Insert: 采用上滤,最坏为O(logN),平均只要比较2.607次,上移1.607层,O(1)
  • DeleteMin: 采用下滤,最坏为O(logN),平均为O(logN)
  • DecreaseKey:
  • IncreaseKey:
  • Delete:
  • BuildHeap: 空堆N个Insert操作来完成,总运行时间O(N)

3. d堆

  • 类似二叉堆,只是节点的儿子数都是d个(除了最底层的一些节点)。
  • 有证据显示,4堆在实践中可以胜过二叉堆。

4.左式堆

概念

具有堆序性质和和零路径长相关的结构性质的二叉树。

性质

  • 堆序性质:父节点小于任意子节点;
  • 结构性质:左儿子节点的零路径长不小于右儿子节点的零路径长。(=>N个节点的左式堆右路径上节点不超过[log(N+1)])

实现方法

采用二叉树的实现方法,每个节点增加零路径长域。

操作及其实践复杂度

  • Merge:从由路径节点入手,O(logN)
  • Insert:合并一个节点左式堆,O(logN)
  • DeleteMin:O(logN)

5. 斜堆

概念

具有堆序的二叉树,但不具有结构性质;其基本操作Merge和左氏堆一致,但是右路径上的节点左右儿子的交换是无条件的(除了右路径上最大节点不交换其左右儿子)

操作

  • Merge:任意单次操作最坏时间O(N),摊还时间O(logN)
  • ...

6. 二项队列(binomial queue)

概念

具有堆序的二项树的集合(森林)。

操作

  • Merge: O(logN)
  • Insert:O(logN);从空堆连续N次插入总最坏时间O(N)
  • Delete:O(logN)

你可能感兴趣的:(数据结构与算法分析C语言描述 总结笔记 第六章)