acm-优先队列.ppt

acm-优先队列

优先队列 堆 左高树 应用 (堆排序 机器调度 霍夫曼编码) 1 引言 定义[优先队列] 优先队列(priority queue)是0个或多个元素的集合,每个元素都有一个优先权或值,对优先队列执行的操作有 1) 查找;2) 插入一个新元素;3) 删除。 最小优先队列( min priority queue):查找操作用来搜索优先权最小的元素,删除操作用来删除该元素 最大优先队列(max priority queue):查找操作用来搜索优先权最大的元素,删除操作用来删除该元素。 1 引言 最大优先队列的抽象数据类型描述 抽象数据类型MaxPriorityQueue{ 实例 有限的元素集合,每个元素都有一个优先权 操作 Create ( ):创建一个空的优先队列 Size ( ):返回队列中的元素数目 Max ( ):返回具有最大优先权的元素 Insert (x):将x 插入队列 DeleteMax (x):从队列中删除具有最大优先权的元素,并将该元素返回至x } 2 线性表 采用无序线性表 假设有一个具有n 个元素的优先队列,那么插入操作可以十分容易地在表的右端末尾执行,插入所需时间为?( 1 )。删除操作时必须查找优先权最大的元素,即在未排序的n 个元素中查找具有最大优先权的元素,所以删除操作所需时间为?(n)。如果利用链表,插入操作在链头执行,时间为?( 1 ),而每个删除操作所需时间为?(n)。 采用有序线性表 元素按递增次序排列,使用链表时则按递减次序排列,这两种描述方法的删除时间均为?( 1 ),插入操作所需时间为?(n)。 3 堆 定义 定义[最大树(最小树)] 每个节点的值都大于(小于)或等于其子节点(如果有的话)值的树。 3 堆 定义[最大堆(最小堆)] 最大(最小)的完全二叉树。 3 堆 最大堆的插入 3 堆 最大堆的删除 3 堆 最大堆的初始化 9.3 堆 3 堆 类MaxHeap templateclass T class MaxHeap { public : MaxHeap(int MaxHeapSize = 10); ~MaxHeap() {delete [] heap;} int Size() const {return CurrentSize;} T Max() {if (CurrentSize == 0) throw OutOfBounds(); return heap[1];} MaxHeapT Insert(const T x); MaxHeapT DeleteMax(T x); void Initialize(T a[], int size, int ArraySize); private : int CurrentSize, MaxSize; T *heap; // 元素数组 } 3 堆 最大堆的插入 templateclass T MaxHeapT MaxHeapT::Insert(const T x) {// 把x 插入到最大堆中 if (CurrentSize == MaxSize) throw NoMem(); // 没有足够空间 / /为x寻找应插入位置 // i 从新的叶节点开始,并沿着树上升 int i = ++CurrentSize; while (i != 1 x heap[i/2]) { // 不能够把x 放入h e a p [ i ] heap[i] = heap[i/2]; // 将元素下移 i /= 2; // 移向父节点 } heap[i] = x; return *this;} 3 堆 最大堆的删除 templateclass T MaxHeapT MaxHeapT::DeleteMax(T x) {// 将最大元素放入x ,并从堆中删除最大元素 // 检查堆是否为空 if (CurrentSize == 0) throw OutOfBounds(); // 队列空 x = heap[1]; // 最大元素 // 重构堆 T y = heap[CurrentSize--]; // 最后一个元素 // 从根开始,为y 寻找合适的位置 int i = 1, // 堆的当前节点 ci = 2; // i的孩子 3 堆 while (ci = CurrentSize) { // heap[ci] 应是i的较大的孩子 i

文档评论(0)

1亿VIP精品文档

相关文档