二叉堆

容易证明:

一棵高为h的完全二叉树有2^h 到 2^(h+1)-1个结点。

这就意味着,完全二叉树的高是[logN]

特点:

任意位置i:

左儿子在位置2i上,右儿子在位置2i+1上,父亲在i/2上

一个堆数据结构将由一个Comparable数组和一个代表当前堆的大小的整数组成:

优先队列的接口:

 1 template <typename Comparable>
 2 class BinaryHeap
 3 {
 4 public:
 5     explicit BinaryHeap ( int capacity = 10 );
 6     explicit BinaryHeap ( const Vector<Comparable> & items);
 7
 8     bool isEmpty() const;
 9     const Comparable & findMin() const;
10
11     void insert(const Comparable & x);
12     void deleteMin();
13     void deleteMin(Coparable & minItem);
14     void makeEmpty();
15 private:
16     int currentSize;
17     vector<Comparable> array;
18     void buildHeap();
19     void percolateDown(int hole);
20 }

堆序的性质:如果想要找到一个最小点,最好是把最小值移动到堆的最上方,使用方法: 上滤

应用比如插入一个元素到堆中:

 1 void insert(const Comparable & x)
 2 {
 3     if(currentSize == array.size()-1)
 4         array.resize(array.size()*2);
 5
 6     int hole = ++currentSize;
 7
 8     for( ; hole > 1 && x < array[hole/2];hole /= 2)
 9         array[hole] = array[hole/2];
10     array[hole] = x;
11 }

想要删除一个堆结点,一般都是要把堆结点移动到最顶端,然后通过 下滤 方法删除:

 1 void deletMin()
 2 {
 3     if(isEmpty())
 4         throw UnderflowException();
 5
 6     array[1] = array[currentSize--];
 7     percolateDown(1);
 8 }
 9 void deleteMin(Comparable & minItem)
10 {
11     if(isEmpty())
12         throw UnderflowException();
13     minItem = array[1];
14     array[1] = array[currentSize--];
15     percolateDown(1);
16 }
17 void percolateDown(int hole)
18 {
19     int child;
20     Comparable tmp = array[hole];
21     for( ; hole*2 <= currentSize;hole = child)
22     {
23         child = hole*2;
24         if(child != currentSize && array[child+1] < array[child])
25             child++;
26         if(array[child] < tmp)
27             array[hole] = array[child];
28         else
29             break;
30     }
31     array[hole] = tmp;
32 }

堆的其他操作:

decreaseKey(p,@):把p结点的元素减少到p-@

increaseKey (p,@):把p结点的元素增加到p+@

remove (p)一般都是先用decreaseKey(p,无限大),减少到最小,然后移动至堆顶端,用deleteMin方法删除。

buildHeap:构造堆原始集合

 1 explicit BinaryHeap( const vector<Comparable> & items): array(item.size()+10),currentSize(items.size())
 2 {
 3     for(int i=0;i<items.size();i++)
 4         array[i+1] = items[i];
 5     buildHeap();
 6 }
 7 void buildHeap()
 8 {
 9     for( int i = currentSize/2; i>0;i--)
10         percolateDown(i);
11 }

本文转自博客园xingoo的博客,原文链接:二叉堆,如需转载请自行联系原博主。

时间: 2024-09-14 10:55:34

二叉堆的相关文章

数据结构-二叉堆(C描述)

1.主要的存储结构 struct HeapStruct { int Capacity;//最大容量 int Size;//当前容量 ElementType *Elements;//数组入口地址 }; typedef struct HeapStruct *PriorityQueue; 结构体HeapStruct实际上是一个数组,二叉堆的底层实现是一个完全二叉树,因此可以很方便的使用数组实现. 完全二叉树的一个重要性质是可以明确给出父子之间的位置关系: 设节点v的秩为i(设根节点秩为0),则 若v有

在A*寻路中使用二叉堆

A*算法中最缓慢的部分就是在开启列表中寻找F值最低的节点或者方格.取决于地图的大小,你可能有十几,成百甚至上千的节点需要在某个时候使用A*搜索.无需多讲,反复搜索这么大的列表会严重拖慢整个过程.然而,这些时间在极大程度上受你存储列表的方式影响. 有序和无序的开启列表:简单的方法 最简单的方法就是顺序存储每个节点,然后每次需要提取最低耗费元素的时候都遍历整个列表.这提供可快速的插入速度,但是移除速度可能是最慢的,因为你需要检查每个元素才能够确定哪个才是F值最低的. 通常你可以保持你列表处于有序状态

C#中基于数组的实现二叉堆

using System;using System.Collections;namespace DataStructure{ /// <summary> /// BinaryHeap 的摘要说明.-------二叉堆(基于数组的实现) /// </summary> public class BinaryHeap:IPriorityQueue { protected ArrayList array; //建立一个最多容纳_length个对象的空二叉堆 public BinaryHea

二叉堆(binary heap)

堆(heap) 亦被称为:优先队列(priority queue),是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因而实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.堆即为解决此类问题设计的一种数据结构. 本文地址:http://www.cnblogs.com/archimedes/p/binary-heap.html,转载请注明源地址. 逻辑定义 n个

数据结构 之 二叉堆(Heap)

注:本节主要讨论最大堆(最小堆同理). 一.堆的概念     堆,又称二叉堆.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.     1.结构性质:     堆是一棵被完全填满的二叉树,有可能的例外是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树(complete binary tree).下图就是这样一个例子.         对于完全二叉树,有这样一些性质:     (1).一棵高h的完全二叉树,其包含2^h ~ (2^(h+1) - 1)个节点.也就是说,完全二叉树的高是[

理解二叉堆数据结构及Swift的堆排序算法实现示例_Swift

二叉堆的性质1.二叉堆是一颗完全二叉树,最后一层的叶子从左到右排列,其它的每一层都是满的 2.最小堆父结点小于等于其每一个子结点的键值,最大堆则相反 3.每个结点的左子树或者右子树都是一个二叉堆 下面是一个最小堆: 堆的存储通常堆是通过一维数组来实现的.在起始数组为 0 的情形中: 1.父节点i的左子节点在位置 (2*i+1); 2.父节点i的右子节点在位置 (2*i+2); 3.子节点i的父节点在位置 floor((i-1)/2); 维持堆的性质我们以最大堆来介绍(后续会分别给出最大堆和最小堆

优先队列之二叉堆与d-堆

二叉堆简介   平时所说的堆,若没加任何修饰,一般就是指二叉堆.同二叉树一样,堆也有两个性质,即结构性和堆序性.正如AVL树一样,对堆的以此操作可能破坏者两个性质中的一个,因此,堆的操作必须要到堆的所有性质都被满足时才能终止. 结构性质   堆是一棵完全填满的二叉树,因为完全二叉树很有规律,所以它可以用一个数组表示而不需要指针.如下图所示,图2中的数组对应图1中的堆.                              图1:二叉堆                             

结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆

实现优先队列结构主要是通过堆完成,主要有:二叉堆.d堆.左式堆.斜堆.二项堆.斐波那契堆.pairing 堆等.   1. 二叉堆  1.1. 定义 完全二叉树,根最小. 存储时使用层序.   1.2. 操作 (1). insert(上滤) 插入末尾 26,不断向上比较,大于26则交换位置,小于则停止.   (2). deleteMin(下滤) 提取末尾元素,放在堆顶,不断下滤:   (3). 其他操作: 都是基于insert(上滤)与deleteMin(下滤)的操作. 减小元素:减小节点的值,

二项堆(一)之 图文解析 和 C语言的实现

概要 本章介绍二项堆,它和之前所讲的堆(二叉堆.左倾堆.斜堆)一样,也是用于实现优先队列的.和以往一样,本文会先对二项堆的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理一样,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录1. 二项树的介绍2. 二项堆的介绍3. 二项堆的基本操作4. 二项堆的C实现(完整源码)5. 二项堆的C测试程序 转载请注明出处:http://www.cnblogs.com/skywan