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

中等职业学校网站建设模块/智能营销系统开发

中等职业学校网站建设模块,智能营销系统开发,遵义网站建设txwl,企业咨询管理公司是干什么的文章目录 前言一、什么是堆?二、堆的实现 1.堆的结构 2.接口实现总结 前言 堆(Heap)是计算机科学中一类特殊的数据结构,是最高效的优先级队列。堆通常是一个可以被看做一棵完全二叉树的数组对象。 一、什么是堆? 现实中我们通常把堆(一种二叉…

文章目录

  • 前言
  • 一、什么是堆?
  • 二、堆的实现
    • 1.堆的结构 
    • 2.接口实现
  • 总结

前言

堆(Heap)是计算机科学中一类特殊的数据结构,是最高效的优先级队列。堆通常是一个可以被看做一棵完全二叉树的数组对象。


一、什么是堆?

现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,

大根堆:根节点的数值总是大于等于(不小于)其左右节点的数值的二叉树

小根堆:根节点的数值总是小于等于(不大于)其左右节点的数值的二叉树
堆的性质:
堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。

二、堆的实现

1.堆的结构

//堆--数组实现--小根堆和大根堆
//小根堆--根节点的值小于其左右孩子节点的值
//大根堆--根节点的值大于其左右孩子节点的值//以下实现以大根堆为例
typedef int HPDateType;
typedef struct Heap
{HPDateType* a;int size;//堆的元素个数int capacity;//堆的容量
}Heap;

2.接口实现

1. 初始化

//初始化
void HPInit(Heap* php)
{assert(php);php->a = (HPDateType*)malloc(sizeof(HPDateType) * 4);if (php->a == NULL){perror("malloc fail");return;}php->capacity = 4;php->size = 0;
}

2. 销毁

//销毁
void HPDestroy(Heap* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}

3. 向上调整

//向上调整
void AdjustUp(HPDateType* 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;}}
}

向上调整:堆插入数据的调整方法,插入数据以后需要保持堆原有的性质,也是建堆的方式之一。其传递参数为孩子节点,利用孩子节点求取其双亲节点,同时因为其余的节点(除去插入数据以外的节点)都保持着其原有的性质,只需要依次比较插入的节点和双亲节点的数值,往复进行。

4. 插入


//插入
void HPPush(Heap* php, HPDateType x)
{assert(php);//判断是否需要扩容if (php->size == php->capacity){HPDateType* tmp = (HPDateType*)realloc(php->a, sizeof(HPDateType) * php->capacity * 2);if (tmp == NULL){perror("realloc fail");return;}php->a = tmp;php->capacity *= 2;}php->a[php->size] = x;php->size++;//插入需要保证堆的性质不改变//需要对插入元素进行向上调整,其左右子树性质才能不变AdjustUp(php->a, php->size - 1);
}

插入数据:1.要进行判断是否需要扩容,

2.对新插入数据进行向上调整,以保证堆的性质不变

5. 向下调整

//向下调整
void AdjustDown(HPDateType* a, int size, int parent)
{//大根堆性质:根节点的数值大于其左右孩子中较大的那个//默认其左孩子较大int child = parent * 2 + 1;//当到达最后一个叶子节点时即可停止交换while (child < size){if (child + 1 < size && a[child] < a[child + 1]){//为什么要对chid+1进行判断?//因为需要进行左右孩子的比较,防止越界child++;}//定义在里面原因:需要每次都进行判断if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = 2 * parent + 1;}else{break;}}
}

参数讲解:1.size的作用:进行判断是否有数组越界访问

2.parent的作用:因为是需要对堆进行删除,要进行数据的交换,而仍旧需要保证堆本身的性质不变,传递parent数值,为确定其孩子节点的数值依旧小于其双亲节点

查漏补缺:1. 需要对于左右节点进行比较,因为大根堆,其根节点始终不小于其孩子节点,先比较出大的孩子节点,然后再进行孩子节点和双亲的比较

2. 需要利用size对child+1进行判断,保证不会越界访问

3. 循环终止条件:直至到最后一个叶子节点既可停止

6. 删除

//删除
void HPPop(Heap* php)
{//删除的本意是对于堆进行修改,即删除堆顶元素assert(php);//交换堆顶元素和最后一个元素,然后进行删除Swap(&php->a[0], &php->a[php->size - 1]);php->size--;//保证堆的性质不发生改变--向下调整AdjustDown(php->a, php->size, 0);}

删除需注意调用向下调整函数时,里面的size是减去交换堆顶元素,进行删除后的size

7. 其余接口

//返回堆顶元素
HPDateType HPTop(Heap* php)
{assert(php);return php->a[0];
}//判空
bool HPEmpty(Heap* php)
{assert(php);return php->size == 0;
}//返回元素个数
int HPSize(Heap* php)
{assert(php);return php->size;
}void Swap(HPDateType* p1, HPDateType* p2)
{HPDateType tmp = *p1;*p1 = *p2;*p2 = tmp;
}

其余接口较为简单实现,只需要注意进行相关断言指针即可


总结

堆,数据结构的一种很有用的结构,其不仅可以适用于存储数据,另外可以对数据进行排序,堆排序,一种非常高效的排序方式,在后续会进行介绍,身为学习者的我们需要对堆的实现做到胸有成竹,从而才能更好的使用。

http://www.jmfq.cn/news/5145409.html

相关文章:

  • 中国菲律宾商会/广州网站优化步骤
  • 贵州做网站公司/站长工具seo综合
  • 论坛推广网站/网络营销课程实训总结
  • 做网站的结论/真正永久免费网站建设
  • 做设计一般用的素材网站是什么/哪个好用?
  • 百合怎么doi怎么做网站/外贸网站建站平台
  • 做网站公司能赚钱吗/和生活app下载安装最新版
  • 成都网站建设app开发/百度图片搜索网页版
  • 怎么样制作一个公司网站/网络推广策划案
  • 杨凯做网站/友链互换平台推荐
  • 专做皮鞋销售网站/整合营销传播的方法包括
  • 做色情灰色网站怎么判刑/美国今天刚刚发生的新闻
  • 工控人如何做自己的网站/免费建立个人网站申请
  • 番禺制作网站设计/重庆网站页面优化
  • 可以自己做视频网站吗/百度推广一年大概多少钱
  • 珠海市企业网站制作服务机构/百度关键词搜索引擎
  • 单位网站建设的优势/百度推广要多少钱
  • 做网站发违规内容 网警抓不抓/b站视频推广网站400
  • 怎么做卖橘子的网站/天津百度搜索排名优化
  • 网站建设yu/有效获客的六大渠道
  • 7黄页网站建设/建站平台
  • 工信部网站实名认证怎么做/微信引流被加软件
  • 自己怎样制作网站/业务推广公司
  • 云服务器 能用来做网站吗/关键词制作软件
  • 有没有在家做的兼职网站/福州短视频seo推荐
  • 安吉网站建设/推广平台排行榜app
  • 笔记本电脑做网站比较畅快/百度指数 移民
  • 网站怎么做自己站长/搭建一个网站需要多少钱?
  • 济阳县做网站公司/seo软件开发
  • 网站里图片做超链接/手游推广渠道平台