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

这篇具有很好参考价值的文章主要介绍了数据结构之树(Topk问题, 链式二叉树)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.topk问题

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

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

时间复杂度O(k)

数据结构之树(Topk问题, 链式二叉树),数据结构,c语言,c++,算法

之后将剩余的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.前序遍历(根->左子树->右子树)

数据结构之树(Topk问题, 链式二叉树),数据结构,c语言,c++,算法

以这个图为例

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

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

同理访问右子树

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

数据结构之树(Topk问题, 链式二叉树),数据结构,c语言,c++,算法

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

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

数据结构之树(Topk问题, 链式二叉树),数据结构,c语言,c++,算法

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

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

数据结构之树(Topk问题, 链式二叉树),数据结构,c语言,c++,算法

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

数据结构之树(Topk问题, 链式二叉树),数据结构,c语言,c++,算法

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) 开辟的空间,依此类推。通过这种方式,可以有效减少内存的使用,提高程序的运行效率。
 
如果你想了解更多关于双路递归的内容,请提供详细信息继续向我提问。文章来源地址https://www.toymoban.com/news/detail-840169.html

到了这里,关于数据结构之树(Topk问题, 链式二叉树)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构之树和二叉树】

    前言: 前篇学习了 数据结构的栈和队列,那么这篇继续学习树及其相关内容基础内容。 / 知识点汇总 / 概念 :树是一种非线性结构,是由有限个节点组成的具有层次关系的集合。倒立的树模样。 有一个特殊的结点,称为根节点,根节点没有前驱。 另外的子树有且只有一个

    2024年01月16日
    浏览(43)
  • 数据结构之树和二叉树定义

      数据结构是程序设计的重要基础,它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发,分析和研究计算机加工的数据的特性,以便为应用所涉及的数据选择适当的逻辑结构、存储结构及其相应的操作方法,为提高利用

    2024年01月21日
    浏览(38)
  • c语言数据结构——树形结构之树和二叉树

    二叉树有什么用? 二叉树应用非常广泛。 在操作系统源程序中,树和森林被用来构造文件系统。我们看到的window和linux等文件管理系统都是树型结构。在编译系统中,如C编译器源代码中,二叉树的中序遍历形式被用来存放C 语言中的表达式。其次二叉树本身的应用也非常多,

    2023年04月18日
    浏览(34)
  • 数据结构之树与二叉树——算法与数据结构入门笔记(五)

    本文是算法与数据结构的学习笔记第五篇,将持续更新,欢迎小伙伴们阅读学习。有不懂的或错误的地方,欢迎交流 前面章节介绍的都是线性存储的数据结构,包括数组、链表、栈、队列。本节带大家学习一种非线性存储的数据结构,即树(tree)。 不管是在面试时,还是日

    2024年02月08日
    浏览(35)
  • 【数据结构】二叉树——链式结构

    目录  一、前置声明 二、二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 三、节点个数以及高度 3.1 节点个数 3.2 叶子节点个数 3.3 第k层节点个数 3.4 二叉树的高度/深度 3.5 查找值为x的节点 四、二叉树的创建和销毁 4.1 构建二叉树 4.2 二叉树销毁 4.3 判断二叉树

    2024年02月16日
    浏览(31)
  • 【数据结构】二叉树链式结构

    🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!! 关注我,关注我,关注我 , 你们将会看到更多的优质内容!!   在之前的二叉树的顺序结

    2024年02月03日
    浏览(27)
  • 【链式二叉树】数据结构链式二叉树的(万字详解)

    前言: 在上一篇博客中,我们已经详解学习了堆的基本知识,今天带大家进入的是二叉树的另外一种存储方式----“链式二叉树”的学习,主要用到的就是“递归思想”!! 前情回顾: 再看二叉树基本操作前,再回顾下二叉树的概念,二叉树是: 空树 非空:根节点,根节点

    2024年01月20日
    浏览(38)
  • 【数据结构】二叉树(链式)

    😛作者:日出等日落 📘 专栏:数据结构           抱怨是一件最没意义的事情。如果实在难以忍受周围的环境,那就暗自努力练好本领,然后跳出那个圈子。 目录  🎄二叉树 ✔二叉树的结构:  ✔BuyNode(创建二叉树节点): 🎄基本函数操作: ✔PreOrder(前序递归遍历):

    2024年02月01日
    浏览(31)
  • 【数据结构】二叉树的链式结构

    学习链式二叉树要知道三种遍历方式,便于对二叉树的节点以及左子树和右子树进行操作。 前序遍历:根、左子树、右子树 中序遍历:左子树、根、右子树 后序遍历:左子树、右子树、根 以下图为例: 得到的结果: 前序遍历:1 2 3 4 5 6 中序遍历:3 2 1 5 4 6 后序遍历:3 2

    2024年02月08日
    浏览(41)
  • 【数据结构】二叉树之链式结构

    🔥 博客主页 : 小羊失眠啦. 🎥 系列专栏 : 《C语言》 《数据结构》 《Linux》 《Cpolar》 ❤️ 感谢大家点赞👍收藏⭐评论✍️ 在学习二叉树各种各样的操作前,我们先来回顾一下二叉树的概念: 二叉树是度不超过2的树,由根结点和左右2个子树组成,每个子树也可以看作

    2024年02月04日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包