二叉树(堆)

news2024/9/24 1:25:43

堆的性质:

堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。
大堆:任何父亲≥孩子
小堆:任何父亲≤孩子

接下来,我们要做的便是对堆进行增加和删除:

首先是增加操作,我们这里采用向上调整的方式来进行增加:

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 = (parent - 1) / 2;
		}
		else
		{
			break;
		}
	}
}

时间复杂度:O(logN)

比如我们有这样一组数据:

int a[] = { 65,100,70,32,50,60 };

然后对其进行操作如下;

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, sizeof(HPDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}

		php->a = tmp;
		php->capacity = newCapacity;
	}

	php->a[php->size] = x;
	php->size++;

	AdjustUP(php->a, php->size - 1);
}

运行结果为:

结果:

嘿嘿,怎么着?这不就是小堆嘛?

那么呢,接下来我们便进行数据的删除操作:

我们先来考虑这样一个问题:删除哪个数据最有价值呢?

显然是删除根because挪动覆盖第一个位置根,关系全乱了,剩下的值,不一定是堆

你看,你看,这不是没乱吗?

雷布斯:这绝对是来捣乱的(这种情况呢,显然只是一个巧合)

不信,我们再来看一个:

你看全乱了,所以这种方式好不好呢?

那不好怎么办呢?别慌,让我们娓娓道来:

我们不影响其他位置,加上尾插和尾删的效率很好,所以只把要删除的元素和最后一个元素换换位置,你看:

向下调整: 

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;
		}
	}
}

时间复杂度:O(logN)

 其次,我们仔细看,经过这一系列操作,我们是不是还把这一组数据中的次小元素给找了出来?

那我们再继续pop,是不是又找到了第三小?依次反复……是不是就成为了排序

我们来操作一下,对某个数组进行排序。

如果要求的是升序,应该选择 大堆 还是 小堆 呢?

升序:建大堆

堆顶跟最后一个交换        最大的数据排好了        剩下数据向下调整,选出次大的,代价是logN

合计是:N*logN

//升序
void HeapSort(int* a, int n)
{
	//建堆	(大堆)or (小堆)
	for (int i = 1; i < n; i++)
	{
		AdjustUP(a, i);
	}
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[0], &a[end]);
		AdjustDown(a, end, 0);
		--end;
	}
}

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

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

相关文章

【算法专题突破】滑动窗口 - 找到字符串中所有字母异位词(14)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;438. 找到字符串中所有字母异位词 - 力扣&#xff08;Leetcode&#xff09; 这道题很好理解&#xff0c;就是找出从不同位置开始的所有异位词。 2. 算法原理 那我们该如…

下载安装python的详细步骤-2023

目录 一、介绍 二、下载 三、安装 四、测试 一、介绍 读者手册&#xff08;必读&#xff09;_csdn文章评分怎么看_云边的快乐猫的博客-CSDN博客 Python 是一种高级编程语言&#xff0c;具有简洁、易读、易学的特点。它由Guido van Rossum于1989年首次发布&#xff0c;并于1…

无涯教程-JavaScript - ACOTH函数

描述 ACOTH函数返回数字的反双曲余切。 语法 ACOTH (number)争论 Argument描述Required/OptionalNumberThe absolute value of Number must be greater than 1. i.e., Number must be must be less than -1 or greater than 1.Required Notes 用于计算双曲反余切的方程为-…

【第200篇原创文章】解决低于1%概率出现的芯片VPSS模块跑飞的问题

在发布SDK内测的时候&#xff0c;我们发现在切换视频分辨率的时候有低概率出现VPSS模块跑飞的情况&#xff0c;概率低于1%&#xff0c;试个两三百次&#xff0c;能出1~2次。切换视频分辨率这个功能在安防产品上也确实存在需求&#xff0c;网络带宽不大好的地方分辨率可以适当下…

边缘计算AI智能安防监控视频平台车辆违停算法详解与应用

随着城市车辆保有量呈现高速增长趋势&#xff0c;交通拥堵、违章行为也日益泛滥。因为车辆未停放在指定区域导致的车位浪费、占用/堵塞交通要道、车辆剐蹭等问题层出不穷。通过人工进行违法停车的监控&#xff0c;不仅让监控人员工作负荷越来越大&#xff0c;而且存在发现不及时…

文心一言:中文生成式对话产品

【产品介绍】 名称 文心一言上线/成立时间 2023年3月27日具体描述 文心一言&#xff08;英文名&#xff1a;ERNIE Bot&#xff09;是百度全新一代知识增强大语言模型&#xff0c;文心大模型家族的新成员&#xff0c;能够与人对话互动&#xff0c;回答问…

pacman下载源失败怎么办

背景 编译c程序的时候&#xff0c;提示链接失败&#xff0c;错误如下&#xff1a; clang-15: error: linker command failed with exit code 1 (use -v to see invocation) [24/25] Linking CXX executable samples/xxx ninja: build stopped: subcommand failed.此处不过多介…

计算机竞赛 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…

数学实验-圆周率π的计算(Mathematica实现)

一、实验名称&#xff1a;圆周率π的计算 二、实验环境&#xff1a;机房、Mathematica 10.3软件 三、实验目的&#xff1a;通过各种方法在Mathematica中计算圆周率π的值&#xff0c; 四、实验内容及结果 1 数值积分法计算π 计算定积分的数值&#xff0c;就得到了的值&am…

外包干了2个月,技术退步明显。。。。。

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

基于SSM+Vue的理发店会员管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

普中51-数码管实验

文章目录 数码管实验**静态数码管实验**动态数码管实验多位数码管简介数码管动态显示原理74HC245 和74HC138芯片介绍74HC245 芯片简介74HC138 芯片简介 代码如下&#xff1a; 数码管实验 如图所示&#xff1a; 从上图可看出&#xff0c;一位数码管的引脚是 10 个&#xff0c;…

path环境变量设置

path是一个包含多个路径的变量&#xff0c;用于指定系统可执行文件的搜索路径。主要作用是能够让系统快速启动一个应用程序。当用户输入一个命令时&#xff0c;系统会在path指定的路径中搜索可执行文件&#xff0c;以确定命令所对应的可执行文件位置。 如运行txt&#xff0c;tx…

VMware虚拟化基础操作实战(基于ESXi6.7 操作系统安装CentOS7.5)

任务要求 环境要求 1、PC终端一台&#xff08;CPU 大于 8 核&#xff0c;内存大于8GB&#xff0c;Windows10 操作系统&#xff09; 2、VM虚拟机&#xff08;VMware workstation14 起&#xff09; 3、安装在虚拟机上的操作系统&#xff08;ESXi6.7 操作系统&#xff09; 4、在…

Sleuth--链路追踪(二)

1 Zipkin的集成 1.1 1 ZipKin介绍 Zipkin 是 Twitter 的一个开源项目&#xff0c;它基于Google Dapper实现&#xff0c;它致力于收集服务的定时数据&#xff0c;以解决微服务架构中的延迟问题&#xff0c;包括数据的收集、存储、查找和展现。 我们可以使用它来收集各个…

InnoDB的页分裂与页合并

数据组织方式 在 InnoDB 存储引擎中&#xff0c;表数据都是根据主键顺序组织存放的&#xff0c;这种存储方式的表称为索引组织表 行数据&#xff0c;都是存储在聚集索引的叶子节点上的。 在 InnoDB 引擎中&#xff0c;数据行是记录在逻辑结构 page 页中的&#xff0c;而每一…

每日一博 - 闲聊 API GateWay

文章目录 概念图解小结 概念 API Gateway&#xff08;API 网关&#xff09;是一个在现代应用程序和服务架构中起关键作用的组件&#xff0c;它具有多种功能和作用&#xff0c;主要包括以下方面&#xff1a; 路由和请求分发&#xff1a;API 网关充当前端入口&#xff0c;根据请…

css中BFC外边距塌陷解决办法

什么是BFC 块级格式化上下文&#xff0c;独立的渲染区域&#xff0c;与外部毫不相干&#xff0c;上下两个元素都设置了外边距&#xff0c;结果会出现重叠的部分合并 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /&…

2020-2023中国高等级自动驾驶产业发展趋势研究-中国高等级自动驾驶发展近况

1.2 中国高等级自动驾驶发展近况 通过对中国高等级自动驾驶行业的观察和分析&#xff0c;亿欧汽车认为&#xff0c;除技术解决方案提供商外&#xff0c;如今的车企、政府、资本同样在产业链中扮演重要角色。此外&#xff0c;车路协同技术的发展也为高等级自动驾驶的发展提供了更…

解密(2023寒假每日一题 20)

给定一个正整数 k k k &#xff0c;有 k k k 次询问&#xff0c;每次给定三个正整数 n i , e i , d i n_i,e_i,d_i ni​,ei​,di​ &#xff0c;求两个正整数 p i , q i p_i,q_i pi​,qi​ &#xff0c;使 n i p i q i &#xff0c; e i d i ( p i − 1 ) ( q i − 1 …