营销平台是什么意思/北京百度seo工作室

营销平台是什么意思,北京百度seo工作室,metinfo网站建设,厦门市政府网站群建设1. 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中通常 把堆使用顺序结构的数组来存储 ,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事&#xff0c…

1. 二叉树的顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中通常 把堆使用顺序结构的数组来存储 ,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构(完全二叉树),一个是操作系统中管理内存区域分段。

顺序存储

2. 堆的概念

堆是将数组数据看作一颗完全二叉树。递增递减数组一定是堆,堆不一定是递增递减数组。在实际意义中,堆可以实现堆排序,时间复杂度是 O(N*longN) ,提高查找效率,解决top k问题。

堆的性质:

1)堆总是一棵完全二叉树

2)堆中某个节点的值总是不大于或不小于其父节点的值

3. 堆的分类

堆可以分为大堆和小堆:

大堆要求: 任意一个父亲 <= 孩子

小堆要求: 任意一个父亲 >= 孩子

堆

4. 堆的实现(数组小堆)

这里将着重利用父子节点之间的关系完成堆的构建以及各类接口的实现:

leftchild = parent*2+1	# 奇数
rightchild = parent*2+2	# 偶数
parent = (child-1)/2	# 不区分左右孩子

如果要实现大堆,就将对应的向下调整算法和向上调整算法的判定更改即可实现。下面将其分为3个模块进行实现小堆Heap.h,Heap.c,test.c

4.1 接口设计(Heap.h)

堆的结构设计和顺序表类似,这里将采用小堆进行设计接口,对堆插入数据时,就要按照堆的规则进行构建。需要注意的是,堆的删除是删除跟节点数据。

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int HPDataType;typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;void HeapInit(HP* php);
void HeapDestory(HP* php);
// 小堆
// 插入,时间复杂度是O(logN)
void HeapPush(HP* php, HPDataType x);
// 规定删除堆顶,即根节点
// 挪动数据覆盖删除跟会出问题
void HeapPop(HP* php);
HPDataType HeapTop(HP* php);
size_t HeapSize(HP* php);
bool HeapEmpty(HP* php);

4.2 接口实现(Heap.c)

1)初始化销毁

void HeapInit(HP* php)
{assert(php);php->a = NULL;php->capacity = php->size = 0;
}void HeapDestory(HP* php)
{assert(php);free(php->a);php->a = NULL;php->capacity = php->size = 0;
}

2)插入,时间复杂度是O(logN)

因为扩容操作只有 HeapPush 使用,因此不将其作为单独函数。

插入的过程中要保证堆符合大堆或者小堆的规则,因此,要对其进行调整,这里将引入向上调整算法,并将其作为单独函数。

向上调整算法主要利用父子下标的特性, 在数据插入成为叶子时,将其与父节点比较,直到满足堆的规则 (这里小堆要满足父节点小于等于子节点 )

插入

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;}}
}// 插入,时间复杂度是O(logN)
void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){int newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, newCapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc fail\n");exit(-1);}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;php->size++;AdjustUp(php->a, php->size - 1);
}

因为后续要重复进行交换,所以将其作为单独一个函数

void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}

3)删除,规定删除堆顶,即根节点

删除是删头,可以选出最大最小的数据,尾删没有多大意义。

有人会想到挪动数据覆盖删除根节点,但会出问题,而且数组不一定有序,挪动后整棵树的父子关系就会全乱了,并且也可能就不是堆了。

因此,这里采用的办法是首先进行首尾交换,然后尾删,这样左右子树依旧是小堆,然后再用向下调整算法,从而将堆构建完成。

删除

void AdjustDown(HPDataType* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child] > a[child + 1]){child++;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapPop(HP* php)
{assert(php);// 空assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);// 不需要进行覆盖php->size--;AdjustDown(php->a, php->size, 0);
}

4)堆顶数据、堆大小、堆空

这三个操作就相对简单,返回堆顶元素要检查堆是否为空。

HPDataType HeapTop(HP* php)
{assert(php);// 空assert(php->size > 0);return php->a[0];
}size_t HeapSize(HP* php)
{assert(php);return php->size;
}bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}

4.3 完整代码

Heap.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <stdbool.h>typedef int HPDataType;typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;void HeapInit(HP* php);
void HeapDestory(HP* php);
// 小堆
// 插入,时间复杂度是O(logN)
void HeapPush(HP* php, HPDataType x);
// 规定删除堆顶,即根节点
// 挪动数据覆盖删除跟会出问题
void HeapPop(HP* php);
HPDataType HeapTop(HP* php);
size_t HeapSize(HP* php);
bool HeapEmpty(HP* php);

Heap.c

#include "Heap.h"// 初始化销毁
void HeapInit(HP* php)
{assert(php);php->a = NULL;php->capacity = php->size = 0;
}void HeapDestory(HP* php)
{assert(php);free(php->a);php->a = NULL;php->capacity = php->size = 0;
}// 实现小堆
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}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;}}
}// 插入,时间复杂度是O(logN)
void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->size == php->capacity){int newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, newCapacity * sizeof(HPDataType));if (tmp == NULL){perror("realloc fail\n");exit(-1);}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;php->size++;AdjustUp(php->a, php->size - 1);
}// 规定删除堆顶,即根节点
// 挪动数据覆盖删除跟会出问题
void AdjustDown(HPDataType* a, int size, int parent)
{int child = parent * 2 + 1;while (child < size){if (child + 1 < size && a[child] > a[child + 1]){child++;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}void HeapPop(HP* php)
{assert(php);// 空assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;AdjustDown(php->a, php->size, 0);
}HPDataType HeapTop(HP* php)
{assert(php);// 空assert(php->size > 0);return php->a[0];
}size_t HeapSize(HP* php)
{assert(php);return php->size;
}bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}

test.c

#include "Heap.h"int main()
{int a[] = { 2,7,0,21,56,786,1,3 };HP hp;HeapInit(&hp);for (int i = 0; i < sizeof(a) / sizeof(int); i++){HeapPush(&hp, a[i]);}int k = 7;printf("打印小堆顶前7个数据:\n");while (k--){printf("%d ", HeapTop(&hp));HeapPop(&hp);}printf("\n堆大小为:%d, 堆是否为空:%d\n", HeapSize(&hp), HeapEmpty(&hp));printf("销毁小堆!\n");HeapDestory(&hp);return 0;
}

运行效果

运行效果
在学会堆的知识后,我们应该怎么应用呢?
下面将介绍两个使用的堆使用:
堆排序&TopK问题:堆的实际应用:堆排序&TopK问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/72300.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VUE的脚手架搭建引入类库

VUE的小白脚手架搭建 真的好久好久自己没有发布自己博客了,对于一直在做后端开发的我 ,由于社会卷啊卷只好学习下怎么搭建前端,一起学习成长吧~哈哈哈(最终目的,能够懂并简易开发) 文章目录 VUE的小白脚手架搭建1.下载node.js2.安装vue脚手架3.创建一个项目4.代码规范约束配置(…

使用 Arduino 和 ThingSpeak 通过互联网进行实时温度和湿度监测

使用 ThingSpeak 和 Arduino 通过 Internet 进行温度和湿度监控 湿度和温度是许多地方(如农场、温室、医疗、工业家庭和办公室)非常常见的测量参数。我们已经介绍了使用 Arduino 进行湿度和温度测量,并在 LCD 上显示数据。 在这个物联网项目中,我们将使用ThingSpeak在互联…

论文分享:PL-ALF框架实现无人机低纹理环境自主飞行

在室内仓库、地下隧道等低纹理复杂场景中&#xff0c;无人机依赖视觉传感器进行自主飞行时&#xff0c;往往会遇到定位精度低、路径规划不稳定等难题。针对这一问题&#xff0c;重庆邮电大学计算机学院雷大江教授团队在IEEE Trans期刊上提出了一种新型自主飞行框架&#xff1a;…

如何筛选能实现共享自助健身房“灵活性”的物联网框架?

共享自助健身房已经成为一种新兴的健身方式&#xff0c;这种模式方便快捷&#xff0c;尤其适合i人健身爱好者&#xff0c;市场接受度还是挺好的。对于无人自助式的健身房要想实现灵活性&#xff0c;要挑选什么样的物联网框架呢&#xff1f; 1. 支持多种通信协议 共享自助健身…

大数据学习(68)- Flink和Spark Streaming

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

(链表)24. 两两交换链表中的节点

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,4…

【Linux】从互斥原理到C++ RAII封装实践

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

大数据-spark3.5安装部署之local模式

spark&#xff0c;一个数据处理框架和计算引擎。 下载 local模式即本地模式&#xff0c;就是不需要任何其他节点资源就可以在本地执行spark代码的环境。用于练习演示。 上传解压 使用PortX将文件上传至/opt 进入/opt目录&#xff0c;创建目录module&#xff0c;解压文件至/o…

Manus “Less structure,More intelligence ”独行云端处理器

根据市场调研机构Statista数据显示&#xff0c;全球的AR/AR的市场规模预计目前将达到2500亿美元&#xff0c;Manus作为VR手套领域的领军企业&#xff0c;足以颠覆你的认知。本篇文章将带你解读Manus产品&#xff0c;针对用户提出的种种问题&#xff0c;Manus又将如何解决且让使…

Oracle数据库存储结构--逻辑存储结构

数据库存储结构&#xff1a;分为物理存储结构和逻辑存储结构。 物理存储结构&#xff1a;操作系统层面如何组织和管理数据 逻辑存储结构&#xff1a;Oracle数据库内部数据组织和管理数据&#xff0c;数据库管理系统层面如何组织和管理数据 Oracle逻辑存储结构 数据库的逻…

芯驿电子 ALINX 亮相德国纽伦堡,Embedded World 2025 精彩回顾

2025年3月13日&#xff0c;全球规模最大的嵌入式行业盛会——德国纽伦堡国际嵌入式展&#xff08;embedded world 2025&#xff09;圆满落幕。 在这场汇聚全球 950 家展商、3 万余专业观众的科技盛宴中&#xff0c;芯驿电子 ALINX 展位人头攒动&#xff0c;多款尖端产品吸引客户…

Nexus File类型Blob Stores迁移至Minio操作指南(上)

#作者&#xff1a;闫乾苓 文章目录 目的前期准备查看file类型Blob Stores数据目录位置aws cli客户端连接工具OrientDB cli客户端连接工具在minio中新建 bucket 目的 增强nexus构件数据的高可用性和扩展性 前期准备 查看并记录需要迁移的Blob Store及repository 查看fil…

蓝桥杯嵌入式组第十二届省赛题目解析+STM32G431RBT6实现源码

文章目录 1.题目解析1.1 分而治之&#xff0c;藕断丝连1.2 模块化思维导图1.3 模块解析1.3.1 KEY模块1.3.2 LED模块1.3.3 LCD模块1.3.4 TIM模块1.3.5 UART模块1.3.5.1 uart数据解析 2.源码3.第十二届题目 前言&#xff1a;STM32G431RBT6实现嵌入式组第十二届题目解析源码&#…

【MySQL】表的约束(上)

文章目录 表的约束什么是表的约束空属性默认值列描述&#xff08;comment&#xff09;零填充&#xff08;zerofill&#xff09;主键 总结 表的约束 什么是表的约束 表的约束&#xff08;Constraints&#xff09;是数据库表中的规则&#xff0c;用于限制存储的数据&#xff0c…

【Unity网络同步框架 - Nakama研究(三)】

文章目录 【Unity网络同步框架 - Nakama研究(三)】准备工作前言Unity部分连接服务器创建并进入房间创建人物人物移动和同步 【Unity网络同步框架 - Nakama研究(三)】 以下部分需要有一定的Unity基础&#xff0c;在官方的案例Pirate Panic基础上进行修改而成。如果没有下载并熟悉…

【AD】6-1 PCB常用规则

间距规则&#xff1a; 可自行修改线宽与间距&#xff08;默认10mil&#xff09; 线宽规则&#xff1a;电源线宽加粗 布线过程中更改线宽&#xff1a;走线状态下&#xff0c;shiftw更改线宽&#xff0c;线宽要在规则范围之内过孔规则&#xff1a; 阻焊规则&#xff1a;

【零基础入门unity游戏开发——unity3D篇】3D物理系统之 —— 3D刚体组件Rigidbody

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…

C# net deepseek RAG AI开发 全流程 介绍

deepseek本地部署教程及net开发对接 步骤详解&#xff1a;安装教程及net开发对接全流程介绍 DeepSeekRAG 中的 RAG&#xff0c;全称是 Retrieval-Augmented Generation&#xff08;检索增强生成&#xff09;&#xff0c;是一种结合外部知识库检索与大模型生成能力的技术架构。其…

b站视频下载工具软件怎么下载

自行配置FFMPEG环境 请优先选择批量下载&#xff0c;会自处理视频和音频文件。 如果要下载更高质量请登陆。 没有配置FFMPEG下载后会有报错提示&#xff0c;视频音频文件无法合并生成mp4文件 更新批量下载标题&#xff0c;只取视频原标题&#xff0c;B站反爬机制登陆后下载多了…

Java 大视界 -- Java 大数据分布式计算中的资源调度与优化策略(131)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…