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

网站建设费用做什么科目思明自助建站软件

网站建设费用做什么科目,思明自助建站软件,金麦建站官网,佛山建设外贸网站公司吗一、堆的本质与核心特性 堆(Heap)是一种基于完全二叉树的抽象数据结构,具有以下核心特性: 结构特性: 完全二叉树:所有层除最后一层外都是满的,且最后一层的节点尽量靠左排列。 数组存储&…

一、堆的本质与核心特性

堆(Heap)是一种基于完全二叉树的抽象数据结构,具有以下核心特性:

结构特性

  • 完全二叉树:所有层除最后一层外都是满的,且最后一层的节点尽量靠左排列。

  • 数组存储:堆的物理存储使用数组,逻辑上映射为树形结构。父子节点下标关系:

  1. 父节点:parent = (child-1)/2

  2. 左子节点:left_child = parent *2 +1;

  3. 右子节点:right_child = parent *2 +2

有序性

  • 大顶堆:父节点的值 ≥ 子节点的值。

  • 小顶堆:父节点的值 ≤ 子节点的值。

二、堆与顺序表的联系

 堆的实现依赖于顺序表(动态数组),但两者在功能上有本质区别:

特性顺序表
存储方式线性存储,元素按插入顺序排列逻辑上是树形结构,物理上用数组存储
操作目标快速随机访问、插入、删除高效获取极值(最大值/最小值)
有序性通常无序必须满足堆性质(父节点与子节点的大小关系)

为什么用顺序表实现堆?

  • 完全二叉树的特性保证了数组存储的紧凑性,无需指针即可通过下标计算父子节点关系。

  • 父子节点的下标关系可通过公式直接计算,访问时间复杂度为 O(1)

 三、堆的核心操作与代码实现

 1. 堆的初始化与销毁

  • 初始化:设置数组指针为NULL,容量和大小初始化为0。

  • 销毁:释放动态数组内存,防止内存泄漏。

typedef struct Heap {HPDataType* arr;  // 动态数组int size;         // 当前元素个数int capacity;     // 数组容量
} HP;// 初始化堆
void HPInit(HP* php) {assert(php);php->arr = NULL;php->size = php->capacity = 0;
}// 销毁堆
void HPDestroy(HP* php) {assert(php);free(php->arr);php->arr = NULL;php->size = php->capacity = 0;
}

 2. 插入元素(Push)与向上调整(AdjustUp)

目标:插入新元素后,维护堆的有序性。

步骤

  1. 将元素插入数组末尾。

  2. 向上调整:若新元素值大于父节点(大顶堆),则交换父子节点,直到满足堆性质。

自下而上建堆:从最后一个非叶子节点开始,逐个向上调整。

时间复杂度:O(log N)。每次插入最多调整树的高度(log N层)。

适用场景:通过已有数组构建堆。

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;  // 堆性质已满足}}
}void HPPush(HP* php, HPDataType x) {assert(php);// 动态扩容(容量不足时翻倍扩容)if (php->size == php->capacity) {size_t newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = realloc(php->arr, sizeof(HPDataType) * newCapacity);if (tmp == NULL) {perror("realloc fail");return;}php->arr = tmp;php->capacity = newCapacity;}// 插入元素并调整php->arr[php->size] = x;php->size++;AdjustUp(php->arr, php->size - 1);  // 从新元素位置向上调整
}

3. 删除堆顶元素(Pop)与向下调整(AdjustDown)

  • 目标:删除堆顶元素后,维护堆的有序性。

 步骤

  1. 将堆顶元素与末尾元素交换。

  2. 删除末尾元素(原堆顶)。

  3. 向下调整:从堆顶开始,若父节点小于子节点,则交换并继续调整。

时间复杂度:O(log N)。每次删除最多调整树的高度。

void AdjustDown(HPDataType* a, int n, int parent) {int child = parent * 2 + 1;  // 左子节点while (child < n) {// 选择较大的子节点(大顶堆)if (child + 1 < n && a[child + 1] > a[child]) {child++;}// 若父节点 < 子节点,则交换并继续调整if (a[child] > a[parent]) {Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;} else {break;  // 堆性质已满足}}
}void HPPop(HP* php) {assert(php && php->size > 0);Swap(&php->arr[0], &php->arr[php->size - 1]);  // 交换堆顶与末尾元素php->size--;AdjustDown(php->arr, php->size, 0);  // 从堆顶向下调整
}

4. 堆化(Heapify)与建堆

  • 目标:将任意数组转换为堆。

  • 方法:从最后一个非叶子节点开始,自底向上执行向下调整。

void HPInitArray(HP* php, HPDataType* a, int n) {assert(php);php->arr = (HPDataType*)malloc(n * sizeof(HPDataType));memcpy(php->arr, a, n * sizeof(HPDataType));php->size = php->capacity = n;// 从最后一个非叶子节点开始调整for (int parent = (n - 2) / 2; parent >= 0; parent--) {AdjustDown(php->arr, n, parent);}
}

四、总结

堆的核心在于通过向上调整(AdjustUp)向下调整(AdjustDown)维护堆性质。其实现依赖动态数组,结合完全二叉树的特性,使得插入、删除和获取极值的操作高效(O(log N))。可扩展以下内容:

  1. 小顶堆:修改比较逻辑(将 > 改为 <)。

  2. 堆排序:通过反复交换堆顶与末尾元素实现排序。

  3. 优先队列:结合堆的性质实现任务调度。

场景实现方式时间复杂度
优先队列插入用AdjustUp,删除用AdjustDownO(log N)
堆排序建堆后依次交换堆顶与末尾元素O(N log N)

堆的核心价值

  • 以 O(1) 时间复杂度获取极值,插入和删除操作仅需 O(log N)

  • 空间利用率高,无需额外指针存储树结构。

http://www.dtcms.com/a/507725.html

相关文章:

  • php网站开发实战教程app和网站开发语言的区别
  • 引领未来交易:达普韦伯全链路Swap交易所系统开发解决方案
  • 2.CUDA编程模型
  • YOLOV4
  • MES系统如何实现生产过程数据采集与管控?
  • 医保局网站建设dw网页设计作品简单
  • 网站如何更换空间wordpress镜像什么意思
  • 使用Yum安装Redis
  • Verilog和FPGA的自学笔记7——流水灯与时序约束(XDC文件的编写)
  • 蜜蜂及飞行昆虫多类别检测数据集VOC+YOLO格式3630张6类别
  • 从零开始:在 TCP 基础上手动搭建 ModBus TCP 协议
  • 台州的网站建设wordpress动漫展主题
  • 外贸假发 网站南京网站设计制作公司排名
  • 【C++闯关笔记】模板的特化
  • iOS flutter 上架 4.3(a)【flutter 专讲】
  • 【鸿蒙flutter】flutter_echarts和webview_flutter 兼容问题解决
  • flutter 鸿蒙
  • 重庆潼南网站建设公司企业网站建设示范平台
  • 临沂做网站哪家好西安的互联网公司
  • Linux下的DNS配置文件/etc/resolv.conf详解(1)
  • MyBatis 中 #{ } 与 ${ } 的区别与使用场景
  • C++源代码行数统计工具的设计与实现
  • temBoard:一款开源PostgreSQL监控和管理工具
  • 模型上下文协议(MCP)——使用Java构建SQL数据库代理(MCP代理教程)
  • GEO内容更新与迭代策略:内容性能的持续优化流程
  • LeeCode 24. 两两交换链表中的节点
  • 怎么查一个网站有没有做301章丘营销型网站设计公司
  • 深圳宝安网站推广昆山建设监察大队网站
  • 最近军事新闻热点大事件汉阳网站推广优化
  • 网站网格设计wordpress 无图插件