数据结构初阶 堆的问题详解(三)

题目一

4.一棵完全二叉树的节点数位为531个,那么这棵树的高度为( )

A 11
B 10
C 8
D 12

我们有最大的节点如下

假设最大高度为10 那么它的最多节点应该是有1023

假设最大高度为9 那么它的最多节点应该是 511

所以说这一题选B

题目二

5.一个具有767个节点的完全二叉树,其叶子节点个数为()

A 383
B 384
C 385
D 386

还是一样 我们假设0度(叶节点)为X0 1度为X1 二度的为X2

根据前面得到的结论

X2 = X0 - 1

我们有

2X0 -1 + X1= 767

2X0 = 768 - X1

这个时候的X1为0

所以说叶节点的个数为384

该题选B

题目三 TOP K 问题

在N个数中找最大的前K个

解法一

排序 这个很简单了 就不多题 一个快排就搞定了

解法二

将N个数依次插入到大堆中 POPK次 就能取到最大的数

解法三

当我们需要寻找的数特别大的时候 比如说这个数是十个亿

十个亿就是四十亿个字节

大概就是4个G左右的内存

这样子的内存就直接否了解法一和解法二

我们创建一个K个数的小堆

比较堆的首元素的大小和要插入数字的大小

如果说插入的数字大于首元素 那么就替换首元素 之后向下调整

这样子到最后在这个堆里面留下的肯定是最大的K个数

大家仔细想想看是不是

(因为最大的数肯定会沉到最下面)

我们来简单实现一下这个算法的逻辑

我们首先先创建一个小堆

然后插入10000个数据

之后开始逐个比较堆顶元素和需要插入的元素的大小

如果说堆顶元素小于我们需要插入的元素

那么删除堆顶元素 之后插入我们的元素

大体思路就是这样子

我们用文件的方法来完成一下

1.建堆 -- 从a中前k个元素建小堆

1.1读出前k个数据建小堆

2.将剩余的n-k个元素依次与堆顶元素交换,不满足则替换

代码如下:

void PrintTopK(const char* file, int k)
{//1.建堆 -- 从a中前k个元素建小堆int* topk = (int*)malloc(sizeof(int) * k);assert(topk);FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}//读出前k个数据建小堆for (int i = 0; i < k; ++i){fscanf(fout, "%d", &topk[i]);}for (int i = (k - 2) / 2; i >= 0; --i){AdJustDown(topk, k, i);}//2.将剩余的n-k个元素依次与堆顶元素交换,不满足则替换int val = 0;//读出剩余的n-k个数据int ret = fscanf(fout, "%d", &val);while (ret != EOF){if (val > topk[0]){topk[0] = val;AdJustDown(topk, k, 0);}ret = fscanf(fout, "%d", &val);}//打印出前k个元素for (int i = 0; i < k; i++){printf("%d ", topk[i]);}printf("\n");free(topk);fclose(fout);
}

 我们用示例来演示一下

造数据

代码如下

void CreateDate()
{//造数据int n = 10000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen fail");return;}for (int i = 0; i < n; i++){int x = rand() % 10000;fprintf(fin, "%d\n", x);}fclose(fin);}

现在实现的话要分成两步:

1.造数据

2.就用我们的PrintTopK函数

主函数这样写:

1.

int main()
{CreateDate();//PrintTopK("data.txt", 10);return 0;
}

2.

int main()
{//CreateDate();PrintTopK("data.txt", 10);return 0;
}

那我们怎么知道取出来的数据是最大的呢?

 这时候我们可以看这步

int x = rand() % 10000;

 我们可以设计10个大于10000的值,就可以知道程序是否正确

看下是否成小堆

 

是小堆

完美实现

以上便是本文所有内容,如有错误请各位大佬不吝赐教,感谢留言

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

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

相关文章

指挥中心操作台的形状及空间布局

在现代化的指挥中心&#xff0c;操作台的形状设计至关重要&#xff0c;它不仅影响着操作人员的工作效率和舒适度&#xff0c;还关系到整个指挥系统的运行效果。常见的指挥中心操作台形状多种多样&#xff0c;以满足不同的功能需求和空间布局。 直线型操作台 直线型操作台是最为…

C语言 | Leetcode C语言题解之第212题单词搜索II

题目&#xff1a; 题解&#xff1a; class Solution { public:struct Node{int id;Node* son[26];Node(){id -1;for(int i 0; i < 26; i) son[i] NULL;}}* root;vector<vector<char>> g;unordered_set<int> ids;vector<string> res;int dx[4] …

Windows编程原理-消息驱动的机制

Windows为每一个输入事件产生一个输入消息&#xff0c;如&#xff1a; 移动鼠标按键…… 从程序角度看待Windows消息处理 Windows使用一个窗口前必须&#xff1a; 填充一个结构&#xff1a;WNDCLASS注册窗口创建窗口使用窗口撤销窗口 从这个机制看&#xff0c;windows操作系统…

console 报错 之 Uncaught (in promise) RangeError: Maximum call stack size exceeded

1. 背景 demo 环境报错。。。 2. 报错问题 3. 问题原因 vue 报错: “RangeError: Maximum call stack size exceeded” 报错通常是由于无限的递归 导致的。当使用 Vue 路由时&#xff0c;如果设置不当&#xff0c;会导致无限的递归&#xff0c;最终导致栈溢出&#xff0c;即…

yolov8 目标检测快速streamlit可视化界面

参考&#xff1a; https://github.com/ultralytics/ultralytics/blob/2330caa50a8a8e0bb61408df8dca0721fb350dbe/ultralytics/solutions/streamlit_inference.py 版本&#xff1a; ultralytics 8.2.27 # Ultralytics YOLO &#x1f680;, AGPL-3.0 licen…

网络安全--计算机网络安全概述

文章目录 网络信息系统安全的目标网络安全的分支举例P2DR模型信息安全模型访问控制的分类多级安全模型 网络信息系统安全的目标 保密性 保证用户信息的保密性&#xff0c;对于非公开的信息&#xff0c;用户无法访问并且无法进行非授权访问&#xff0c;举例子就是&#xff1a;防…

用StartAI文生图做电商设计 AI服装面料设计教程

AI电商设计需要考虑以下多个问题&#xff0c;面面俱到即可小成本做电商 步骤&#xff1a;电商选品确定文生图关键 理解面料特性&#xff1a;了解不同面料的特性&#xff0c;如透气性、弹性、耐用性等&#xff0c;以便更好地利用AI进行设计。色彩搭配&#xff1a;利用AI分析流…

java项目总结2

3.了解Java的内存分配 4.重载 定义&#xff1a;在一个类中&#xff0c;有相同名的&#xff0c;但是却是不同参数&#xff08;返回类型可以不一样&#xff09; 重载的优点&#xff1a; 1.减少定义方法时使用的单词 2.减少调用方法时候的麻烦&#xff08;比如sum的返回两个数的…

《UDS协议从入门到精通》系列——图解0x84:安全数据传输

《UDS协议从入门到精通》系列——图解0x84&#xff1a;安全数据传输 一、简介二、数据包格式2.1 服务请求格式2.2 服务响应格式2.2.1 肯定响应2.2.2 否定响应 Tip&#x1f4cc;&#xff1a;本文描述中但凡涉及到其他UDS服务的&#xff0c;将陆续提供链接跳转方式以便快速了解他…

以太坊DApp交易量激增83%的背后原因解析

引言 最近&#xff0c;以太坊网络上的去中心化应用程序&#xff08;DApp&#xff09;交易量激增83%&#xff0c;引发了广泛关注和讨论。尽管交易费用高达2.4美元&#xff0c;但以太坊仍在DApp交易量方面遥遥领先于其他区块链网络。本文将深入探讨导致这一现象的主要原因&#…

机器人控制系列教程之Delta机器人奇异性分析

并联机器人奇异性 对于并联机构的奇异性问题比串联机构复杂。某些位形机构会失去自由度&#xff0c;某些位形机构会出现不可控自由度。其分析方法主要有几何法和代数法&#xff0c; 几何法&#xff1a; 即根据高等空间相关知识和机构中角度范围、干涉条件等推导出机构的奇异位…

力扣Hot100-19删除链表的倒数第n个节点(双指针)

给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例 3&#xff1a;…

OpenCV 图像最小外包围矩形的绘制及长短边的计算

目录 一、概述 1.1意义 1.2应用 二、代码实现 三、实现效果 3.1原始图像 3.2处理后图像 3.3数据输出 一、概述 最小外包围矩形&#xff08;Minimum Bounding Rectangle, MBR&#xff09;在计算机视觉和图像处理中的意义和应用非常广泛。它是指能够完全包围目标的最小矩…

phpexcel导入导出

前言&#xff1a; 如果你到处的excel软件打开有问题&#xff0c;下面有介绍解决办法 导入 1. composer init 初始化 2. 下载phpspreadsheet 这里需要注意php版本&#xff0c;需要大于7.2 composer require phpoffice/phpspreadsheet3. 编写代码 <?php require vendo…

WPF 3D绘图 点云 系列五

基本概念:点云是某个坐标系下的点的数据集。 可能包含丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等 点云可以将现实世界原子化,通过高精度的点云数据可以还原现实世界。万物皆点云。 通过三维激光扫描仪进行数据采集获取点云数据,其次通过二维影像进行…

Java | Leetcode Java题解之第213题打家劫舍II

题目&#xff1a; 题解&#xff1a; class Solution {public int rob(int[] nums) {int length nums.length;if (length 1) {return nums[0];} else if (length 2) {return Math.max(nums[0], nums[1]);}return Math.max(robRange(nums, 0, length - 2), robRange(nums, 1,…

小试牛刀-区块链代币锁仓(Web页面)

Welcome to Code Blocks blog 本篇文章主要介绍了 [区跨链代币锁仓(Web页面)] ❤博主广交技术好友&#xff0c;喜欢我的文章的可以关注一下❤ 目录 1.编写目的 2.开发环境 3.实现功能 4.代码实现 4.1 必要文件 4.1.1 ABI Json文件(LockerContractABI.json) 4.2 代码详解…

AI绘画-Stable Diffusion 原理介绍及使用

引言 好像很多朋友对AI绘图有兴趣&#xff0c;AI绘画背后&#xff0c;依旧是大模型的训练。但绘图类AI对计算机显卡有较高要求。建议先了解基本原理及如何使用&#xff0c;在看看如何实现自己垂直行业的绘图AI逻辑。或者作为使用者&#xff0c;调用已有的server接口。 首先需…

单片机软件架构连载(3)-typedef

今天给大家讲typedef&#xff0c;这个关键字在实际产品开发中&#xff0c;也是海量应用。 技术涉及知识点比较多&#xff0c;有些并不常用&#xff0c;我们以贴近实际为原则&#xff0c;让大家把学习时间都花在重点上。 1.typedef的概念 typedef 是 C 语言中的一个关键字&…

DP:背包问题----0/1背包问题

文章目录 &#x1f497;背包问题&#x1f49b;背包问题的变体&#x1f9e1;0/1 背包问题的数学定义&#x1f49a;解决背包问题的方法&#x1f499;例子 &#x1f497;解决背包问题的一般步骤&#xff1f;&#x1f497;例题&#x1f497;总结 ❤️❤️❤️❤️❤️博客主页&…