二叉堆

一、意思:

     1、堆(heap)是计算机科学中一类特殊的数据结构的统称。

     2、堆通常是一个可以被看做一棵树得数组对象[1],总是一颗完整的完全二叉树。

     3、堆的分类:

                                 ·大根堆(最大堆):某个结点的值总是不大于其父结点的值

                       ·小根堆(最小堆):某个结点的值总是不小于其父结点的值。

     4、堆是非线性数据结构,相当于一维数组,有两个直接后继。

     5、堆的定义:

        n个元素的序列{k1,k2,…,ki,…,kn}有且仅有(ki≤k2i且ki≤k2i+1)或者(ki≥k2i且ki≥k2i+1)(i=[1,])的关系,称之为堆。

二、插入式建堆的相关操作:(小根堆)

    1、插入操作及其调整:

int heap[size],n;
void up(int p){ //插入到末尾,再向上调整
    while(p>1){
        if(heap[p]<heap[p/2]){
            swap(heap[p],heap[p/2]);
            p=p/2;
        }
        else
        break;
    }
}
void insert(int val){
    heap[++n]=val;
    up(n);
}

         2、获取堆顶元素

int GetTop(){
    return heap[1];
}

      3、删除堆顶元素

      Extract操作把堆顶从二叉堆中移除。我们把堆顶heap[1]与存储在数组末尾的结点heap[n]交换,然后移除数组末尾的结点(令n减小1),最后把堆顶元素通过交换的方式向下调整,直至满足堆性质。其时间复制度为堆的深度,即O(logN)。

void down(int p){
    int s=2*p;
    if(s<=n){
        if(s<n&&heap[s]>heap[s++]) s++;
        if(heap[s]<heap[p]) {
            swap(heap[s],heap[p]);
            p=s,s=2*p;
        }
        else break;
     }
}
void Extract(){
    heap[1]=heap[n--];
    down(1);
}

   4、删除位置为P的结点

        该操作与Extract相似,先把heap[p]与heap[n]交换,然后令n减小1。注意此时heap[p]既有可能需要向下调整,也有可能需要向上调整,需要分别进行检查和处理。时间复杂度O(logN)。

void Remove(int k){
    heap[k]=heap[n--];
    up(k),down(k);
}

注释:

     [1]: 数组对象一般指对象数组对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组就行了。


迭代日志:

    1、(1.0)版 —— 2022-05-12

posted @ 2022-05-12 20:21  Yoly狐  阅读(23)  评论(0)    收藏  举报