堆和哈希表的实现以及应用(一)
来源:互联网 发布:不会数学能学编程吗 编辑:程序博客网 时间:2024/06/16 00:09
首先我来和大家一起了解一下堆的一些问题。堆是一个非常实用的数据结构,在一些算法的优化和一些高级数据结构上都能用到堆。比如优先队列、hash_map、迪杰斯特拉算法(最短路的优化)等等,所以我们大家学好堆是有必要的,对我们学习高深的一些算法和数据结构非常的有用。
我所知道的堆有已下几种:二叉堆(就是我们平常说的堆)、二项堆、斐波那契堆;其中后者都是前者的优化。今天呢,由于我的水平有限,只能和大家一起探讨一下二叉堆了。
二叉堆堆的一些基本知识
二叉堆是一种特殊的堆,二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足堆特性:父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值,且每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。
二叉堆的存储方式
二叉堆一般用数组来表示。例如,根结点在数组中的位置是1,第n个位置的子节点分别在2n和2n+1。因此,第1个位置的子节点在2和3,第2个位置的子节点在4和5。以此类推,这种存储方式便于寻找父节点和子节点。如下图两个堆:
左图是小根堆;右图是大根堆
1 11 / \ / \ 2 3 9 10 / \ / \ / \ / \ 4 5 6 7 5 6 7 8 / \ / \ / \ / \ 8 9 10 11 1 2 3 4
如下是小根堆的实现过程:
#define MAXN 10000template<typename Type>class Heap{ private: int size; Type data[MAXN+1]; void siftdown( int pos ); public: Heap(); void push( Type key ); Type pop(); void make_heap(); bool empty(); void clear(); int get_size();};template<typename Type>Heap<Type>::Heap(){ size= 0; } template<typename Type>int Heap<Type>::get_size(){ return size; }template<typename Type>bool Heap<Type>::empty(){ return size== 0;} template<typename Type>void Heap<Type>::clear(){ size= 0; }template<typename Type>void Heap<Type>::siftdown( int pos ){ while( pos<<1<= size ){ int t= pos<<1; if( (pos<<1)+ 1<= size && data[(pos<<1)+1]<data[t] ) t= (pos<<1)+ 1; if( data[t]< data[pos] ){ Type tmp= data[t]; data[t]= data[pos]; data[pos]= tmp; pos= t; } else break; }}template<typename Type>void Heap<Type>::push( Type key ){ data[++size]= key; int pos= size; while( pos> 1 ){ if( data[pos>>1]> data[pos] ){ Type tmp= data[pos]; data[pos]= data[pos>>1]; data[pos>>1]= tmp; pos>>= 1; } else break; }}template<typename Type>Type Heap<Type>::pop(){ Type tmp= data[1]; data[1]= data[size]; data[size]= tmp; size--; siftdown(1); return data[size+1];}
- 堆和哈希表的实现以及应用(一)
- 堆和哈希表的实现与应用(二)
- 堆以及堆的相关应用
- 堆数据结构的实现以及堆排序
- 堆的概念以及实现堆
- 模拟实现堆+堆的应用
- 【堆】二分堆的实现以及STL中的堆
- 堆的实现与应用
- 堆和栈的区别(一)
- 堆和栈的区别(一)
- 堆和栈的区别(一)
- 堆和堆的应用:堆排序和优先队列
- 堆的应用:topk问题以及堆排序
- 只用下滤法建堆以及最大(小)堆的实现
- 堆排序的思想以及实现过程(链式存储)
- 堆(优先队列)的构建以及基本操作实现
- 堆以及堆排序实现
- 最大最小堆的操作以及实现
- 实例说明Web中的状态跟踪
- QT 读取文件
- 开发宝典(二)
- 如何获取e.printStackTrace()的内容
- 资源汇集
- 堆和哈希表的实现以及应用(一)
- JDK1.5官方下载 _JDK1.5API(chm)下载 以及 JDK环境变量配
- SandBox目录
- Apache创建虚拟目录绑定域名
- java关于时间的操作,格式化时间等
- HTTP协议详解
- libjingle源码分析之三:P2P
- C++ 虚函数概述
- 相似图片搜索的原理