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

题目一

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,一经查实,立即删除!

相关文章

AI算力需求激增:全球服务器市场迎来黄金发展期

AI算力需求的暴增正在推动全球服务器规模的快速增长。这一趋势主要源于人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;特别是大模型算法的应用&#xff0c;使得智能算力需求激增。 麦肯锡预测&#xff0c;在AI大模型相关算力需求的快速增加推动下&#xff0c;以…

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

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

AI芯片-系统架构师(二十二)

1、&#xff08;重点&#xff09;&#xff08;&#xff09;中&#xff0c;编程开发人员分为首席程序员和“类”程序员。 A自适应软件开发&#xff08;ASD&#xff09; B极限编程&#xff08;XP&#xff09;开发方法 C开放统一过程开发方法&#xff08;Open UP&#xff09; …

如何在Java中实现Excel操作

如何在Java中实现Excel操作 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨如何在Java中实现对Excel文件的操作&#xff0c;这在日常的数据处…

如何使用echart画k线图

使用ECharts绘制K线图需要以下步骤&#xff1a; 1. 引入ECharts库 首先&#xff0c;在HTML文件中引入ECharts库的文件。可以从ECharts官方网站上下载最新版本的库文件&#xff0c;并将其引入到HTML文件中。例如&#xff1a; html <script src"echarts.min.js">…

基于golang的文章信息抓取

基于golang的文章信息抓取 学习golang爬虫&#xff0c;实现广度爬取&#xff0c;抓取特定的网页地址&#xff1a;测试站点新笔趣阁&#xff08;https://www.xsbiquge.com/&#xff09; 主要学习golang的goroutine和channel之间的协作&#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操作系统…

前端面试题1

解释一下什么是闭包&#xff08;Closure&#xff09;&#xff0c;并给出一个实际应用场景。 解答: 闭包是指有权访问另一个函数作用域中的变量的函数&#xff0c;创建闭包最常见的方式就是在一个函数内部创建另一个函数。闭包可以让内部函数访问到外部函数的作用域&#xff0c;…

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分析流…

【特征选择精通指南】在scikit-learn中优化你的机器学习模型

标题&#xff1a;【特征选择精通指南】在scikit-learn中优化你的机器学习模型 特征选择是机器学习中的一个关键步骤&#xff0c;它涉及从原始数据集中选择最相关的特征以提高模型的性能和减少过拟合的风险。scikit-learn&#xff0c;作为Python中一个广泛使用的机器学习库&…

C++编程逻辑讲解step by step:多态

概念 C面向对象中的多态性是指同一种类型的对象在不同的情况下表现出不同的行为。 从代码层面看&#xff0c;实际上“同一种类型”就表明了&#xff0c;这里可以在循环里用相同的代码统一处理不同的功能。这一点很重要。 题目 界面上&#xff0c;拖动鼠标画矩形或者椭圆。 …

自动做市商AMM

自动做市商&#xff08;AMM&#xff09;&#xff1a;重塑去中心化金融的市场机制 1、为什么需要AMM&#xff1f; 在传统金融市场中&#xff0c;做市商通过提供买卖双方的报价来维持市场的流动性和稳定性。然而&#xff0c;在去中心化金融&#xff08;DeFi&#xff09;领域&am…

linux screen

计算机最开始只有黑白界面,我们通过键盘设备输入字符进行编程等行为进行编程, 让计算机完成我们设定的任务. 随着计算机技术及硬件的发展, 黑白屏幕被图形界面替代, 应用程序的 GUI 界面操作成为主流, 只有远程终端由于带宽占用少,实时性高等优点一直存在到现在. 然后有时由于网…

FFmpeg开发笔记(四十三)使用SRS开启SRT协议的视频直播服务

《FFmpeg开发实战&#xff1a;从零基础到短视频上线》一书在第10章介绍了轻量级流媒体服务器MediaMTX&#xff0c;通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。不过MediaMTX的功能实在是太简单了&#xff0c;无法应用于真实直播的生产环境&#xff0c;真正能用于生产环境…

java项目总结2

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

AUTOSAR汽车电子嵌入式编程精讲300篇-智能网联汽车CAN总线-基于迁移学习的驾驶行为评价方法

目录 前言 驾驶行为评价相关研究 系统模型和应用价值 挑战和解决方案 迁移学习在汽车工业中的应用 算法模型 驾驶行为评价模型的设计 驾驶行为数据的收集和预处理 驾驶行为评价模型的搭建 实验环境和数值结果 实验环境 MTL网络性能分析 前言 随着5G、GPS导航、…