当前位置: 首页 > wzjs >正文

成都网站优化平台网页网站导读怎么做

成都网站优化平台,网页网站导读怎么做,一建建设网站首页,wordpress看不到主题定义 堆(Heap)是一种特殊的完全二叉树结构,它满足以下性质: 结构性:必须是完全二叉树 有序性:任意节点的值都满足特定的大小关系 大根堆:父节点值 ≥ 子节点值 小根堆:父节点值…

定义

堆(Heap)是一种特殊的完全二叉树结构,它满足以下性质:

 结构性:必须是完全二叉树 

有序性:任意节点的值都满足特定的大小关系

  • 大根堆:父节点值 ≥ 子节点值
  • 小根堆:父节点值 ≤ 子节点值

完全二叉树的概念

定义:除了最后一层外,其他层的节点都是满的,且最后一层的节点都靠左排列

特点:

  • 从上到下,从左到右依次填充
  • 如果最后一层不满,缺少的部分一定在右边

 

分类

1. 大根堆(最大堆)

  • 定义:任意节点的值都大于或等于其子节点的值
  • 特点:根节点是整个堆中的最大值

2. 小根堆(最小堆)

  • 定义:任意节点的值都小于或等于其子节点的值
  • 特点:根节点是整个堆中的最小值

性质

1. 结构性质

节点编号:从上到下,从左到右,从0开始编号

父子关系:对于任意节点 i

   父节点索引 = (i - 1) / 2
   左子节点索引 = 2 * i + 1
   右子节点索引 = 2 * i + 2

深度关系:

  • n个节点的堆的高度为⌊log₂n⌋ + 1
  • 第k层最多有2^(k-1)个节点

2.基本性质

堆的大小:n个节点的完全二叉树的高度为⌊log₂n⌋ + 1

节点位置:

  • 最后一个非叶子节点的位置:n/2 - 1
  • 第一个叶子节点的位置:n/2

查找性质:

  • 查找最大值(大根堆):O(1)
  • 查找最小值(小根堆):O(1)


模拟实现 

头文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int HPDataType;
typedef struct Heap
{HPDataType* _a;int _size;int _capacity;
}Heap;void HeapInit(Heap* hp);
// 堆的销毁
void HeapDestory(Heap* hp);
// 堆的插入
void HeapPush(Heap* hp, HPDataType x);
// 堆的删除
void HeapPop(Heap* hp);
// 取堆顶的数据
HPDataType HeapTop(Heap* hp);
// 堆的数据个数
int HeapSize(Heap* hp);
// 堆的判空
int HeapEmpty(Heap* hp);

具体实现

1.初始化和销毁

void HeapInit(Heap* hp)
{
    assert(hp);
    hp->_a = NULL;
    hp->_capacity = 0;
    hp->_size = 0;
}

void HeapDestory(Heap* hp)
{
    assert(hp);
    free(hp->_a);
    hp->_a = NULL;
    hp->_capacity = 0;
    hp->_size = 0;

}

        堆的创建需要从倒数的第一个非叶子节点的子树开始调整,一直调整到根节点的树,这里需要掌握向上调整算法的应用

2.向上调整

// 交换两个元素
static void Swap(HPDataType* a, HPDataType* b) {
    HPDataType tmp = *a;
    *a = *b;
    *b = tmp;
}

// 向上调整(大堆)
static void AdjustUp(HPDataType* a, int child) {
    int parent = (child - 1) / 2;
    while (child > 0) {
        if (a[child] > a[parent]) { // 子节点大于父节点则交换
            Swap(&a[child], &a[parent]);
            child = parent;
            parent = (child - 1) / 2;
        }
        else {
            break; // 满足堆条件,退出
        }
    }
}

3.插入

        堆的插堆的尾部开始插入的,再进行向上调整算法,直到满足堆。

// 堆的插入
void HeapPush(Heap* hp, HPDataType x)
{
    assert(hp);
    // 容量不足时扩容
    if (hp->_size == hp->_capacity) {
        int newCapacity = hp->_capacity == 0 ? 4 : hp->_capacity * 2;
        HPDataType* tmp = (HPDataType*)realloc(hp->_a, sizeof(HPDataType) * newCapacity);
        if (tmp == NULL) {
            perror("realloc failed");
            exit(-1);
        }
        hp->_a = tmp;
        hp->_capacity = newCapacity;
    }
    hp->_a[hp->_size++] = x;
    AdjustUp(hp->_a, hp->_size - 1);

}

如图所示,插入后向上的调整过程:

4.向下调整

        删除堆是删除堆顶的数据,将堆顶的数据和最后一个数据交换,然后删除数组最后一个数据,再进行向下调整

// 向下调整(大堆)
static void AdjustDown(HPDataType* a, int size, int parent) {

    int child = parent * 2 + 1; // 左子节点
    while (child < size) {
        // 选出较大的子节点
        if (child + 1 < size && a[child + 1] > a[child]) 
        {
            child++;
        }

        if (a[child] > a[parent]) 
        { 
            // 子节点大于父节点则交换
            Swap(&a[child], &a[parent]);
            parent = child;
            child = parent * 2 + 1;
        }
        else {
            break; // 满足堆条件,退出
        }
    }
}

5.删除

删除堆顶元素

// 堆的删除
void HeapPop(Heap* hp)
{
    assert(hp);
    assert(hp->_size);

    Swap(&hp->_a[0], &hp->_a[hp->_size - 1]);
    hp->_size--;
    AdjustDown(hp->_a, hp->_size, 0);

}

//调整过程如图所示

6.其余操作 

// 取堆顶的数据
HPDataType HeapTop(Heap* hp) 
{
    assert(hp && hp->_size > 0);
    return hp->_a[0];
}
// 堆的数据个数
int HeapSize(Heap* hp)
{
    assert(hp);
    return hp->_size;

}
// 堆的判空
int HeapEmpty(Heap* hp) 
{
    assert(hp);
    return hp->_size == 0;
}

        后续会接着说明堆的常见应用,比如堆排序和TOP K问题。


文章转载自:

http://pH7zYuKS.rbnnq.cn
http://pYhwFQu1.rbnnq.cn
http://qZd7uZA6.rbnnq.cn
http://8WxZ8XlZ.rbnnq.cn
http://Fb5p74FQ.rbnnq.cn
http://GQxACovS.rbnnq.cn
http://WC5J6CsD.rbnnq.cn
http://0zdhk5Ba.rbnnq.cn
http://d9ZIyGmE.rbnnq.cn
http://z7xL6kla.rbnnq.cn
http://SE3MYGzu.rbnnq.cn
http://h0DWnEA3.rbnnq.cn
http://A2Mif4lt.rbnnq.cn
http://qNvUuXMO.rbnnq.cn
http://fR0VVPvn.rbnnq.cn
http://vomYjj7m.rbnnq.cn
http://4FBS52Ib.rbnnq.cn
http://pLoT2tT6.rbnnq.cn
http://jlqAaBq3.rbnnq.cn
http://z3z4gbtL.rbnnq.cn
http://l91h5IKo.rbnnq.cn
http://ukh1ZmiH.rbnnq.cn
http://evzeq5Jr.rbnnq.cn
http://nM7lNyv9.rbnnq.cn
http://FCMBC7Fy.rbnnq.cn
http://GSszAEhq.rbnnq.cn
http://j3qlyX2q.rbnnq.cn
http://QyTnGvfA.rbnnq.cn
http://DPpTG1Bs.rbnnq.cn
http://DYpbaJwx.rbnnq.cn
http://www.dtcms.com/wzjs/721722.html

相关文章:

  • 做网站花多少钱深圳pc端网站开发
  • 可以做游戏的网站有哪些wordpress主题名字
  • 企业网站建设哪家快广州网站优化
  • 杭州网站定制开发微信网站开发与网站实质区别
  • python做网站还是数据库30岁做网站运营
  • 东莞网站网络阿里巴巴国际站怎么找客户
  • 百度一下官方网站wordpress 导入md
  • 朝阳做网站企业加盟网站建设
  • 四川省建设网站评标专家考试普陀手机网站建设
  • 有网站代码怎么建设依安县建设网站
  • 电商网站建设成本一个网站通常包含多个网页吗
  • 房地产活动策划网站户型图在哪个网站找
  • 进入深圳市住房和建设局网站空包网站建设
  • 百度云建站网站建设商业网站建设方案
  • 上海建设银行官网网站6广告图片素材
  • 厨具 技术支持东莞网站建设微页制作网站模板下载
  • 网站设计背景图片怎么做的制作网站团队人员
  • 给人做ppt的网站免费网络营销
  • 网站交互设计建立网站用英语
  • dw做网站一般是多大的尺寸网站模版怎样使用
  • 视频网站开发 博客园弹窗广告最多的网站
  • 乐清网约车事件新乡seo外包
  • 北京地铁建设的网站58同城网络营销
  • 中国建设银行积分换购网站外贸网站源码哪个好
  • 建建建设网站公司电话号码中企动力公司简介
  • 网站开发人员绩效如何计算做文件的网站
  • 外贸网站建站平台安卓开发需要学什么
  • 淘宝网站建设那么便宜网站建设与管理专业就业方向
  • 免费行情软件app网站直播下载浙江网站建设技术公司
  • 锦州网站建设更好百度网盘提取码入口