堆和哈希表的实现以及应用(一)

来源:互联网 发布:不会数学能学编程吗 编辑:程序博客网 时间: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];}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 情绪总是很烦躁怎么办 情绪不好爱生气怎么办 心里每天烦躁该怎么办 心情低落想哭怎么办 心老是烦躁急怎么办 易烦躁睡眠不好怎么办 天气热心情烦躁怎么办 嘴巴里有溃疡怎么办 嘴巴里面反复烂怎么办 多处口腔溃烂怎么办 口腔黏膜破了怎么办 有鼻炎鼻子痒怎么办 感冒就清鼻涕怎么办 怀孕感冒流鼻涕打喷嚏怎么办 过敏性鼻炎打喷嚏流鼻涕怎么办 宝宝黄鼻涕鼻塞怎么办 鼻炎总是打喷嚏流鼻涕怎么办 新生儿流黄鼻涕怎么办 感冒鼻塞流鼻涕喷嚏怎么办 宝宝总是打喷嚏流鼻涕怎么办 不停的打喷嚏流鼻涕怎么办 宝宝不停打喷嚏流鼻涕怎么办 孕妇感冒流鼻涕打喷嚏怎么办 孕妇感冒咳嗽流鼻涕怎么办 鼻子痒流鼻涕流眼泪怎么办 天冷鼻子流鼻涕怎么办 感冒流水样鼻涕怎么办 一直有清水鼻涕怎么办 孩子总打喷嚏鼻塞怎么办 4岁儿童流鼻涕怎么办 孕妇清鼻涕不停怎么办 感冒流鼻水怎么办速效办法 一岁宝宝流清涕怎么办 咳嗽喉咙痛有痰怎么办 冻感冒了流鼻涕怎么办 吸烟经常嗓子疼怎么办 擦鼻涕擦破了怎么办 感冒鼻水流不停怎么办 流鼻涕鼻子都擦红了怎么办 鼻子不停的流水怎么办 擦鼻涕耳朵疼怎么办