数据结构-二叉树-堆(二)

一、建堆的时间复杂度问题

1、除了向上调整建堆,我们还可以向下调整建堆。不能在根上直接开始向下调整。这里的条件就是左右子树必须都是大堆或者小堆。我们可以倒着往前走,可以从最后一个叶子开始调整。但是从叶子开始调整没有意义。所以我们可以从倒数的第一个的非叶子开始调整。也就是最后一个叶子的父亲节点开始向下调整建堆。一层一层向上进行向下调整建堆,把大的数字往上调小的数字往下沉。那么问题来了怎么找到最后一个叶子的父亲节点。

我们先可以求出最后一个孩子的下标然后应用公式 parent = (child-1)/ 2 算出最后一个孩子的父亲节点的下标。

void HeapSort(int* a,int n)
{
	//首先建立大堆
	/*for (int i = 1; i < n; i++)
	{
		UpAdjust(a, i);
	}*/

	//向下调整建堆的效率要比向上调整建堆的效率要高
	for (int i = (n - 1 - 1) / 2; i >= 0; i--)
	{
		DownAdjust(a, i, n);
	}

	//交换堆头和堆尾的数字选出最大的数字放到堆尾
	//然后向下调整
	int end = n - 1;
	while (end > 0)
	{
		Swap(&a[end], &a[0]);
		DownAdjust(a, 0, end);
		end--;
	}
}

2、向下调整和向上调整建堆的时间复杂度

向下调整:倒数第二层有2^(h-2) 个节点

建堆的调整的次数

错位相减法算出时间复杂度

每层节点个数 × 这一层最坏向下调整多少次

最后的结果为:

所以时间复杂度为O(N)  T(N) = N - h。

向上调整:

再次使用上面的错位相减法

所以时间复杂度为O(NlogN)。

因为向下调整的过程中节点多的调整的次数少,节点少的调整的次数多。向上调整的过程中节点少的调整的次数少,节点多的调整的次数多

排序调堆的时间复杂度也是O(NlogN)。

TOPK 问题

1、建N个数的大堆,再Pop k次就可以了。

2、加入N很大呢?N是100亿呢? K == 50

      1G大约十亿字节。所以是40G左右

内存中存不下,数据是在磁盘文件中。

我们可以用100亿个数中的K个数建立一个小堆。遍历剩下的数据,如果这个数据比堆顶的数据大,就替代它进堆(向下调整)最后这个小堆的数据就是最大的前K个。

void HeapTopK(int* a, int n, int k)
{
	//首先向下调整建堆
	int* topk = (int*)malloc(sizeof(int) * k);
	//从a数组里读
	for (int i = 0; i < k; i++)
	{
		topk[i] = a[i];
	}
    //建立小堆
	for (int i = (k - 1 - 1) / 2; i >= 0; i--)
	{
		DownAdjust(topk, i, k);
	}
	//遍历剩下的数如果大于堆顶的数据我们就让它进堆并向下调整
	for (int i = k + 1; i < n; i++)
	{
		if (a[i]  > topk[0])
		{
			topk[0] = a[i];
			DownAdjust(topk, 0, k);
		}
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

架构师的六大生存法则与价值创造

目录 什么影响架构的成败 架构师的六大生存法则 一、所有的架构规划必须有且只有一个正确的目标 二、架构活动需要尊重和顺应人性 三、架构活动在有限的资源下最大化商业价值 四、架构师要考虑依赖的商业模块和技术生命周期 五、架构师为什么要关注技术体系的外部适应性…

【InternLM】大模型的评测——OpenCompass

1. OpenCompass简介 1.1 基本介绍 大模型开源开放评测体系 “司南” (OpenCompass2.0)由上海人工智能实验室科学家团队发布&#xff0c;用于为大语言模型、多模态模型等提供一站式评测服务。其主要特点如下&#xff1a; 开源可复现&#xff1a;提供公平、公开、可复现的大模型…

最详细步骤解决:Apps targeting Android12 and higher are required to specify...

问题原因&#xff1a; 当targetSdkVersion>31时&#xff0c;需要在AndroidManifest.xml中配置android:exported的值&#xff0c;该值为boolean类型。 android:exported解释&#xff1a; activity 是否可由其他应用的组件启动&#xff1a; 如果设为 "true"&#…

9节点牛拉法matlab

潮流计算程序matlab 牛拉法 采用matlab对9节点进行潮流计算&#xff0c;采用牛拉法&#xff0c;程序运行可靠。

探索设计模式的魅力:AI赋能分层模式,解构未来,智领风潮

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 探索设计模式的魅力&#xff1a;AI赋能分层模式&#xff0c;解构未来&#xff0c;智领风潮 ✨欢迎…

Linux-进程和计划任务管理⭐

目录 一、程序和进程 1.程序 2.进程 3.线程与进程 二、ps查看静态进程信息 1.ps aux 命令 2.ps-静态查看系统进程 3.ps -elf 三、top-查看进程动态信息 四、pgrep查看进程信息 五、pstree-查看进程树 六、控制进程 1.进程启动方式 2.调度启动 3.进程的前后台调…

ShardingSphere 5.x 系列【26】 数据分片原理之 SQL 路由

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 携带分片键2.1 直接路由2.2 标准路由2.3 笛卡尔路由3. 不携带分片…

BGP选路实验(锐捷)---Origin选路

实验拓扑图 基本配置如图所示 要求&#xff1a;R5上利用loopback口建立多个分段ip&#xff0c;利用bgp选路原则让双网段数据通过R6转发&#xff0c;单网段数据通过R7转发&#xff0c;通过修改Origin的属性类型为intcomplete&#xff08;利用三种不同的Origin属性的优先顺序&am…

投资标的参考

1、中央汇金投资有限责任公司 1.1、香港中央结算有限公司 2、中央汇金投资有限责任公司持股列表 _ 东方财富网_ 数据频道东方财富网提供十大流通股东数据、十大股东数据、股东持股明细、股东持股变动统计、股东持股分析、股东持股统计、股东协同等数据&#xff0c;充分展示股东…

SpringBoot+MyBatis-Plus+jsqlparser实现多租户功能

前言 多租户技术&#xff08;multi-tenancy technology&#xff09;是一种软件架构技术&#xff0c;它允许在单个系统实例上为多个用户或组织提供服务&#xff0c;同时确保这些用户之间数据的隔离性。在多租户架构中&#xff0c;每个租户&#xff08;可以是个人用户、企业、组…

python中开发页面的两种方法:Qt Designer(PyQt图形化界面拖拽开发App界面)以及Django(开发Web应用框架)

一、开发独立的窗口&#xff0c;App的那种&#xff0c;可使用tkinter或者PyQt 使用PyQt时&#xff0c;里面有个工具Qt Designer&#xff0c;是一个可视化的界面设计工具&#xff0c;可以通过拖拽等方式来设计界面。下面就是Qt Designer的操作界面&#xff1a; 参考链接如下&am…

代码随想录-算法训练营day24【回溯01:理论基础、组合】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第七章 回溯算法part01 今日内容&#xff1a;● 理论基础 ● 77. 组合 详细布置 理论基础 其实在讲解二叉树的时候&#xff0c;就给大家介绍过回溯&#xff0c;这次正式开启回溯算法&#xff0c;大家可以先看视频&a…

docker入门级命令

基本概念 docker的连个基本概念&#xff1a;镜像、容器。 docker镜像可以理解为是存储docker安装包的地方&#xff0c;比如&#xff1a;mcr.microsoft.com/mssql/server:2017-latest是sqlserver的docker镜像。 可以通过docker pull命令拉取远程镜像到本地。比如&#xff1a;…

【论文浅尝】Phi-3-mini:A Highly Capable Language Model Locally on Your Phone

Phi-3-mini phi-3-mini&#xff0c;一个3.8亿个参数的语言模型&#xff0c;训练了3.3万亿个token&#xff0c;其总体性能&#xff0c;通过学术基准和内部测试进行衡量&#xff0c;可以与Mixtral 8x7B和GPT-3.5等模型相媲美(在MMLU上达到69%&#xff0c;在MT-bench上达到8.38)&…

什么是云手机?云手机有什么用?

过去&#xff0c;我们手中的手机是我们生活、工作、娱乐的得力助手&#xff0c;但随着时代的变迁和技术的发展&#xff0c;我们需要的不仅仅是一部手机&#xff0c;而是一个更强大、更灵活的工具。在这个时候&#xff0c;云手机横空出世&#xff0c;成为了我们手机使用的新选择…

[GXYCTF 2019]BabyUpload

过滤 <? 且后缀不能有 php 上传1.jpg文件&#xff0c;内容为&#xff1a; <script languagephp>eval($_POST[cmd]);</script> 但文件后缀为.jpg&#xff0c;蚁剑不能连接。那怎么办呢&#xff1f; .htaccess文件&#xff1a;解析.jpg文件中的php代码 &#xf…

Druid高性能数据库连接池?SpringBoot整合MyBatis整合SpringMVC整合Druid

文章目录 Druid高性能数据库连接池&#xff1f;SpringBoot整合MyBatis整合SpringMVC整合Druid异常记录spring-boot-starter-parent作用Druid介绍什么是数据库连接池&#xff1f;为什么选择Druid数据库连接池整合SpringBoot,MyBatis,SpringMVC,Druid到Maven项目的真个流程pom文件…

Redis入门到实战教程(基础篇)笔记

教学来源&#xff1a; Redis课程介绍导学_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1cr4y1671t?p1一、Redis 入门 1.认识NoSQL 2.Redis在虚拟机中的安装和开机自启 Redis在虚拟机中安装和配置开机自启-CSDN博客https://blog.csdn.net/qq_69183322/article/deta…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台&#xff0c;供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心&#xff0c;最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

docker 基本命令

目录 一、docker 镜像操作命令 1.1.查询软件镜像 1.2.docker pull&#xff1a;下载镜像 1.3.docker push&#xff1a;上传镜像 1.4.docker images&#xff1a;查看本地镜像 1.5.docker inspect &#xff1a;获取镜像详细信息 1.6.docker tag&#xff1a;添加镜像标签 …
最新文章