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

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

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

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

cpp 复制代码
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个。

cpp 复制代码
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);
		}
	}
}
相关推荐
wabs6661 小时前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance1 小时前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
凉茶钱1 小时前
【数据结构】堆的应用
c语言·数据结构
间歇性努力持续性发呆的野生快乐选手3 小时前
栈的性质(进栈,出栈,访问)
数据结构·c++
m0_547486663 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光3 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
怪奇云呼军3 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
乐观勇敢坚强的老彭5 小时前
C++ 竞赛常用算法模板速查表
开发语言·c++·算法
高洁015 小时前
工信部教考中心证书
人工智能·深度学习·算法·机器学习·知识图谱
我变成萤火虫5 小时前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法