数据结构之树(Topk问题, 链式二叉树)

news2024/12/23 5:36:34

一.topk问题

取N个数中最大(小)的前k个值,N远大于k

这道题可以用堆的方法来解决,首先取这N个数的前k个值,用它们建堆

时间复杂度O(k)

之后将剩余的N-k个数据依次与堆顶数据进行比较,如果比堆顶数据大,则将堆顶数据覆盖后向下调整

时间复杂度(N-k)*log(N)

总共的时间复杂度为O(N*log(N))

void adjustDown(HeapDataType* p, int size, int parent)
{
	int child = parent * 2 + 1;
	if (p[child] > p[child + 1])
		child++;
	while (child <= size)
	{
		if (child + 1 <= size && p[parent] > p[child])
		{
			Swap(&p[parent], &p[child]);
			parent = child;
			child = child * 2 + 1;
			if (p[child] > p[child + 1])
				child++;
		}
		else break;
	}
}
void heapTopk(HeapDataType* p, int size)
{
	int k;
	scanf_s("%d", &k);
	for (int i = (k - 1 - 1) / 2; i >= 0; i--)
		adjustDown(p, k, i);
	while (size - k > 0)
	{
		if (p[size - 1] > p[0])
			p[0] = p[size - 1];
		adjustDown(p, k, 0);
		size--;
	}
}

二.链式二叉树

用数组建堆只能用在完全二叉树的情况下,那其他情况该怎么办?

显然顺序表已经行不通了,那我们不妨换链表试试

链式二叉树是一种用链表结构存储二叉树的方式,每个节点包含一个值以及左右子节点的指针。其遍历方式分为前序遍历、中序遍历和后序遍历。

1.前序遍历(根->左子树->右子树)

以这个图为例

首先访问根的数据,也就是1

然后访问1的左子树,也就是以2为根节点的树,然后再访问2的左子树,也就是以3为根节点的树,直到访问到空节点,

同理访问右子树

1->2->3->N->N->N->4->5->N->N->6->N->N

void preTreeNode(TNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	printf("%d ", root->data);
	preTreeNode(root->left);
	preTreeNode(root->right);
}

2.中序遍历(左子树->根->右子树)

首先访问1的左子树,也就是以2为根节点的树,然后访问2的左子树,也就是以3为根节点的树,直到访问到空,最后回到根节点1,然后同理去访问右子树

N->3->N->2->N->1->N->5->N->4->N->6->N

void inTreeNode(TNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	inTreeNode(root->left);
	printf("%d ", root->data);
	inTreeNode(root->right);
}

3.后序遍历(左子树->右子树->根)

N->N->3->N->2->N->N->5->N->N->6->4->1

void postTreeNode(TNode* root)
{
	if (root == NULL)
	{
		printf("N ");
		return;
	}
	postTreeNode(root->left);
	postTreeNode(root->right);
	printf("%d ", root->data);
}

三.双路递归

1.概念及应用场景

双路递归是一种算法思想,指的是在递归过程中同时处理两个子问题,从而提高递归的效率和性能。例如,在归并排序中,可以同时对左半部分和右半部分进行排序,然后将它们合并成一个有序的序列,从而实现排序的目的。
 
归并排序是一种基于分治思想的排序算法,其基本思想是将一个数组分成两半,对每一半进行排序,然后将排序后的两个半数组合并成一个有序的数组。归并排序可以用于内排序和外排序,其时间复杂度为 O(nlogn),是一种稳定的排序算法。

在处理一些问题时,双路递归比单路递归更有效率,例如在归并排序中,双路递归可以同时对左半部分和右半部分进行排序,然后将它们合并成一个有序的序列,从而减少了排序的时间复杂度。
 
另外,在一些搜索问题中,双路递归也可以更快地找到目标元素,例如在二叉搜索树中,可以同时从左子树和右子树进行搜索,从而更快地找到目标元素。
 
总的来说,双路递归适用于那些可以将问题拆分成两个子问题,并且可以同时处理这两个子问题的情况。在这种情况下,双路递归可以减少递归的次数,提高算法的效率。但是,使用双路递归也需要注意一些问题,例如递归深度的增加和内存的消耗等。

2.与单路递归的区别

单路递归和双路递归都有各自的优缺点,下面是它们的一些特点:
 
- 单路递归的优点:
 

  • - 代码简单易懂,容易理解和实现。
  • - 适用于一些简单的问题,如斐波那契数列、阶乘等。

- 单路递归的缺点:
 

  • - 可能会出现栈溢出的情况,尤其是在处理大数据量时。
  • - 对于某些问题可能会出现重复计算,导致效率低下。

- 双路递归的优点:

 

  • - 可以减少重复计算,提高效率。
  • - 可以处理一些复杂的问题,如二叉树的遍历、图的深度优先搜索等。

- 双路递归的缺点:

 

  • - 代码相对复杂,不易理解和维护。
  • - 可能会消耗更多的内存,尤其是在处理大规模数据时。

 
需要根据具体情况选择使用单路递归还是双路递归。如果问题规模较小,单路递归可能更适合;如果问题规模较大或需要更高的效率,双路递归可能更合适。同时,还需要考虑程序的内存使用情况和算法的可扩展性等因素。

3.空间复用

空间复用是指在不同的时间段内,不同的用户共享相同的一组资源,这样可以降低成本,提高资源利用率。空间复用是多用户接入的重要技术,它可以实现数据、信号、频率、时间等方面的共享。
 
以LTE通信为例,空间复用是利用两个较大的天线阵元或赋形波束之间的不相关性,向一个终端/基站并行发射多个数据流,以实现链路容量的提高。

双路递归中的空间复用是指在递归过程中重复利用之前开辟的空间,以减少内存使用量。以 longlong Fib(size_t N) 函数为例,该函数的作用是计算斐波那契数列中第 N 个数的值。在递归计算 Fib(2) 时,会开辟一块空间来存储计算结果;在计算 Fib(1) 时,会复用 Fib(2) 开辟的空间;在计算 Fib(5) 时,会复用 Fib(4) 开辟的空间,依此类推。通过这种方式,可以有效减少内存的使用,提高程序的运行效率。
 
如果你想了解更多关于双路递归的内容,请提供详细信息继续向我提问。

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

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

相关文章

2024年独立站C端只靠SEO还有机会吗?(川圣SEO)蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; 2024年独立站C端只靠SEO还有机会吗&#xff1f;#蜘蛛池SEO 都2024年了&#xff0c;你的外贸独立站推广还需要…

Xilinx 7系列FPGA的配置流程

目录 1.4配置流程 1.4.1 设备上电 ​编辑1.4.2 清除配置寄存器 1.4.3 采样模式引脚 1.4.4 同步 ​编辑1.4.5 检测设备ID ​编辑1.4.6 加载配置数据 1.4.7 CRC校验 1.4.8 启动序列 1.4配置流程 对于所有配置模式&#xff0c;7系列的基本配置流程都是相同的&…

高速USB3.0接口控制器芯片--T630

T630芯片是方寸微电子自主研发的USB3.0超高速控制器&#xff0c;具有功能丰富、性能强劲、扩展性强等特点&#xff0c;可广泛应用于视频采集卡、视频会议摄像头、监控摄像头、数字摄录机、工业照相机、测量和测试设备、医疗成像设备、打印机、扫描仪、指纹采集终端等众多电子产…

记事小本本

记事小本本 实现效果 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

TRANSCEIVER 中的LPM和DFE模块

接收端都使用了通信中常用的LPM和DFE 本质上是高通滤波器&#xff0c;一个是单项被动&#xff0c;而常用的DFE用 了反馈。参见这篇不错的文章。 赛灵思7系列FPGA GT收发器中的RX均衡器_lpm和dfe-CSDN博客

C#,T检验(T -Test)的算法与源代码

1 T-Test 学生t检验(英语:Students t-test)是指虚无假设成立时的任一检定统计有学生t-分布的统计假说检定,属于母数统计。学生t检验常作为检验一群来自正态分配母体的独立样本之期望值的是否为某一实数,或是二群来自正态分配母体的独立样本之期望值的差是否为某一实数。举…

Android自定义view从入门到高级

简介 什么是自定义view&#xff1f;我认为只要不是编译器直接提供可以使用的view&#xff0c;都可以认为是自定义view。自定义view主要分为两大类&#xff0c;第一类自定义view可以通过系统提供的各种view组合&#xff0c;样式变化实现的view。第二类是通过继承view或者ViewGro…

​高山 MPV 四驱旗舰版:新能源时代的豪华出行新选择

随着新能源技术的不断进步和消费者对高端出行体验的追求&#xff0c;MPV&#xff08;Multi-Purpose Vehicle&#xff0c;多用途车&#xff09;市场迎来了新的发展机遇。 长城汽车旗下的魏牌&#xff0c;凭借其在新能源领域的深厚技术积累&#xff0c;推出了全新的高山MPV四驱旗…

用通俗易懂的方式讲解:大模型 Rerank 模型部署及使用技巧总结

Rerank 在 RAG&#xff08;Retrieval-Augmented Generation&#xff09;过程中扮演了一个非常重要的角色&#xff0c;普通的 RAG 可能会检索到大量的文档&#xff0c;但这些文档可能并不是所有的都跟问题相关&#xff0c;而 Rerank 可以对文档进行重新排序和筛选&#xff0c;让…

【Python 5】----Pytest接口自动化(实现基础的测试框架)

安装准备 安装好pytest的环境及allure环境 1. 安装pytest pip insatll pytest2.安装allure (需要确保安装了jdk环境&#xff09;安装allure命令行&#xff1a; 访问allure官网&#xff0c;下载allure2.13.5的安装包&#xff0c;将其bin路径 添加进环境变量path中在cmd里面…

flutter选择国家或地区的电话号码区号

1.国家区号列表&#xff08;带字母索引侧边栏&#xff09; import package:generated/l10n.dart; import package:widget/login/area_index_bar_widget.dart; import package:flutter/material.dart; import package:flutter_screenutil/flutter_screenutil.dart;class LoginA…

位图、布隆过滤器

普通的哈希表增删查改的效率的确达到了令人满意的O&#xff08;1&#xff09;&#xff0c;但是本质还是以空间换时间来实现的。并且哈希表中是直接存储数据的&#xff0c;应对一些海量数据处理的问题可能就会造成空间不足的问题。 加入现有40亿个无符号整形数字&#xff0c;设…

RPC基础知识回顾

RPC基础知识回顾 1、先认识一下大家熟悉的HTTP 大家都了解HTTP吧。相信项目中也用过一些。 比如: JDK自带的老旧的HttpURLConnection&#xff0c;封装写的很累,java8之前基于HTTP1.0。在java9开始支持Http2.0Spring的其中RestTemplate都是基于HTTP/1.1的请求。最新的还有Sp…

SpringCloudEureka理论与入门

文章目录 1. 前置工作1.1 搭建 user-server1.1.1 pom1.1.2 po&#xff0c;mapper&#xff0c;controller1.1.3 yml1.1.4 启动类1.1.5 启动并访问 1.2 搭建 order-server1.2.1 pom1.2.2 po mapper controller1.2.3 yml1.2.4 启动类1.2.5 启动并访问 1.3 两个服务通信 2. Eureka2…

当HR问你:“对于你申请的这个岗位,你觉得你欠缺什么?”【文章底部添加进大学生就业交流群】

当HR问这个问题时&#xff0c;你可以展示自我认识和诚实&#xff0c;同时展现你对自己的积极态度和学习能力。以下是一个可能的回答示例&#xff1a; "对于我申请的这个岗位&#xff0c;我认为我可能欠缺一些行业特定的经验。虽然我在相关领域有一定的工作经验和技能&…

H5 网课宣传引导跳转微信单页源码

源码名称&#xff1a;网课宣传引导跳转微信单页 源码介绍&#xff1a;一款网课销售宣传单页源码&#xff0c;源码支持一键复制微信号并跳转打开微信功能。 需求环境&#xff1a;H5 提示&#xff1a;源码仅支持复制微信和跳转打开微信&#xff0c;客户需自行贴贴搜索添加好友…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的石头剪刀布手势识别系统详解(深度学习模型+UI界面代码+训练数据集)

摘要&#xff1a;本篇博客深入探讨了使用深度学习技术开发石头剪刀布手势识别系统的过程&#xff0c;并分享了完整代码。该系统利用先进的YOLOv8、YOLOv7、YOLOv6、YOLOv5算法&#xff0c;并对这几个版本进行性能对比&#xff0c;如mAP、F1 Score等关键指标。文章详细阐述了YOL…

【漏洞复现】网康科技 NS-ASG 应用安全网关 SQL注入漏洞(CVE-2024-2330)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

碳实践 | 基于“界、源、算、质、查”五步法,实现企业组织碳核算

碳排放核算是夯实碳排放统计的基础&#xff0c;提高碳排放数据质量的关键&#xff0c;同时&#xff0c;将推动能耗“双控”向碳排放“双控”转变。总体来看&#xff0c;碳核算分为区域层面、组织层面和产品层面的碳核算&#xff0c;这三个层面的意义和计算方法完全不同。本文将…

SingleSpa微前端基本使用以及原理

先说说singleSpa的缺点 不够灵活 不能动态加载css文件css不隔离没有js沙箱的机制 ( 没有全局对象 每次切换的应用 都是同一个window ) 但是刚刚接触微前端 可以了解一下微前端的基础使用 qiankun微前端框架已经很成熟 也是基于singleSpa来实现的 点击跳转qiankun的基础使用 大…