第三章:查找与排序(下)----------- 3.25 知其然知其所以然:小顶堆与topK的具体代码实现

嵌入式学习笔记- 关于电容的纹波电流 纹波电流是导致电解电容发热、影响其寿命的关键交流电流成分。它不是一种特殊的电流,而是电路中必然存在的现象。要重视,不能忽视。必须保证电路中的纹波电流 < 电容的额定纹波电流。电容鼓包爆浆,要怀疑是否是纹波电流过大或电容ESR变大所致。希望这个解释能帮助您彻底理解这个概念!二 电容纹波电流与频率的关系在大多数情况下,频率越高,电容所能承受的额定纹波电流值越大。【个人理解:因为频率越低ESR越大,具体见第三节ESR与频率的关系】下面我为您详细解释为什么会这样,以及在实际应用中如何考虑。 阅读详情

小顶堆与topK的具体代码实现:

       求海量数据(正整数)按逆序排列的前k个数(TopK),因为数量太大,不能全部存储在内存中,只能一个一个地从磁盘或者网络上读取数据,请设计一个高效的算法来解决这个问题。

       第一行:用户输入K,代表要求得topK。

       随后的N(不限制)行,每一行是一个整数,代表用户输入的数据。

       用户输入-1代表输入终止。

       请输出topK,从小到大,空格分割。

       解决:大顶堆。

思路:

输入N个数据时,若n<k,依次添加到数组(堆)当中;当填入数据达到k时,立刻堆化。

若n>k,比较要填入数与堆顶数据,若x>heap[0],将heap[0]赋值为x,并向下堆化。

ps:n:已填入数据的数量。

 代码:

#include<iostream>
using namespace std;

int* heap;  //全局变量 ===> 数组头指针(数组名) 
int size=0;
int k;  //输出前k个数	

/*******/ 
void deal(int x);
void makeMinHeap(int A[],int length); 
void MinHeapFixDown(int A[],int i,int n);
void printRs();
/*******/

int main(){
	std::ios_base::sync_with_stdio(false);
 	
	cin>>k;
	
	heap=new int[k]; // 动态创建数组 
	
	int x;  
	while((cin>>x)&&x!=-1){
		deal(x); //处理x 
	}	
	printRs();
			
	return 0;
}

/*
如果数据的数量小等于k,直接加入堆中
等于k的时候,进行堆化
*/ 
void deal(int x){
	if(size<k){
		heap[size++]=x;
		
		if(size==k){
			//堆化
		 	makeMinHeap(heap,k);
		}
	}
	else{
		//x和堆顶进行比较,如果x大于堆顶,x将堆顶挤掉,并向下调整 
		if(heap[0]<x){
			heap[0]=x;
			MinHeapFixDown(heap,0,k);
			printRs();
		}	
	}
	
} 

void printRs(){
	for(int i=0;i<k;i++){
		cout<<heap[i]<<" ";
	}
	cout<<endl;
}


void makeMinHeap(int A[],int length){
	int n=length;
	for(int i=n/2-1;i>=0;i--){
		MinHeapFixDown(A,i,n);
	}
} 
 
//向下调整函数 
void MinHeapFixDown(int A[],int i,int n){
	//找到左右孩子
	int left=2*i+1;
	int right=2*i+2;
	//左孩子已经越界,i就是叶子节点
	if(left>=n){
		return;
	} 
	 int min=left;
	 if(right>=n){
	 	min=left;
	 }
	 else{
	 	if(A[right]<A[left]){
	 		min=right;
	 	}
	 }
	 //min指向了左右孩子中较小的那个
	 
	 //如果A[i]比两个孩子都要小,不用调整
	 if(A[i]<A[min]){
	 	return;
	 } 
	 //否则,找到两个孩子中较小的,和i交换
	 int temp=A[i];
	 A[i]=A[min];
	 A[min]=temp;
	 
	 //小孩子那个位置的值发生了变化,i变更为小孩子的那个位置,递归调整
	 MinHeapFixDown(A,min,n);	 
}

 结果:

python提取图片中的文字写入excel文件,并打包为exe可执行文件 阅读详情

相关推荐

用友U8接口开发全攻略:从EAI到OpenAPI的5种方式详解(附避坑指南)

本文深度解析了用友U8系统接口开发的五种核心方式:EAI、API、OpenAPI、SQL直连与内部CO组件。文章详细对比了各方式的适用场景、优缺点及实战操作,并提供了清晰的选型决策框架与避坑指南,帮助开发者根据具体业务需求选择最高效、最稳定的集成路径。

weixin_29322855的博客 688

TopK问题

海量数据中寻找TopK问题Top K问题介绍Top K问题举例及解答 Top K问题介绍   所谓的Top K问题:在海量数据中找出出现频率最好的前K个数,或者从海量数据中找出最大的前K个数。例如,在搜索引擎中,统计搜索最热门的10个查询词/在歌曲库中统计下载最高的前10首歌等。针对Top K问题,通常方案是分治+Trie树/Hash+小顶堆,即先将数据集按照Hash方法分解成多个小数据集,然后使...

ThreeAspects的博客 1339

从频谱入手搞定ESD:手把手教你用示波器和频谱仪分析静电干扰(以Type-C接口为例)

本文详细介绍了如何利用示波器和频谱仪分析Type-C接口的ESD干扰问题。通过频谱特性分析、耦合路径诊断和实战测试,提供了一套完整的ESD防护方案,包括三级防护设计和器件选型建议,帮助工程师有效解决静电放电导致的系统故障。

weixin_42662293的博客 348

大顶堆或者小顶堆PriorityQueue解决TopK和k个最值问题

通过lambdas表达式设置排序方式,这里设置大顶堆,即堆顶的元素为堆的最大值。如果是第k大,则可以用大顶堆排序,依次弹出k-1个数,则堆顶元素就是第k大。如果是第k小,则可以用小顶堆排序,依次弹出k-1个数,则堆顶元素就是第k小。容量k,默认为小根堆,即堆顶的元素为堆的最小值。如果是k大,则可以用大顶堆排序,依次弹出k个数。如果是k小,则可以用小顶堆排序,依次弹出k个数。牛客第BM47 题:寻找第K大。

weixin_42774617的博客 734

特征模理论指导滤波天线设计的优势和方法

本文探讨了特征模理论在滤波天线设计中的应用优势和方法。特征模理论通过分析天线结构的本征模特性,突破了传统经验设计的局限,实现了辐射与滤波功能的一体化设计。文章重点阐述了如何利用模式显著性(MS)和模式加权系数(MWC)来指导辐射零点的产生,揭示了辐射零点形成的物理机制。通过特征模分析,设计师可以明确调控天线结构和馈电系统,优化滤波性能。这种方法为现代多频/宽带滤波天线设计提供了理论依据和实用工具,显著提升了设计效率和性能指标。

qq_64207806的博客 957

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

ProceduralMan的博客 7412

使用小顶堆解决TOPK问题

首先我们需要构建一个小顶堆 我们可以用PriorityQueue这个优先队列,它给我们从小到大排序好了的,至于什么是小顶堆可以去看看堆和数的概念. PriorityQueue pq = new PriorityQueue<>(); 我们需要对小顶堆的堆顶与插入的数进行比较 private int k = 1000; //从文件中找到最大的一千个数 PriorityQueue<Integer> pq = new PriorityQueue<>(k);

jmzzzzz的博客 703

光猫改桥接后,一根网线搞定IPTV和上网的保姆级教程(附VLAN配置避坑点)

本文详细介绍了光猫改桥接后如何通过单线复用技术实现IPTV和上网功能共存。从VLAN配置原理到具体操作步骤,包括光猫超级管理员权限获取、VLAN绑定设置及路由器IPTV功能配置,提供了全面的保姆级教程。特别针对常见问题如IPTV信号丢失、网速下降等给出了实用解决方案,帮助用户轻松避坑。

weixin_29927965的博客 1782

堆排序(TOP K)

堆的定义,它是一个完全二叉树,存储结构为数组。给出一个数组之后,可以认为这个初始堆是按照结点序号从小到大存放的。 满足对的定义要求,所有父结点的键值都要不小于(或者不大于)子结点的键值,称为大顶堆(小顶堆)。 对堆的操作有插入、删除,这些操作都要对堆进行一定的调整以保证堆的定义。 堆的插入直接放在堆最后一个位置,同时从此位置开始向上调整,向上调整的代码: void MinHeapFixup

help_HELP_的专栏 1008

银河麒麟编译libjpeg库并配置qt环境

银河麒麟下编译libjpeg库并配置qt环境验证

小米的修行之路 1015

【BlueZ】编译产物详解:可执行文件/库文件/工具的生成路径与用途

BlueZ二次开发编译产物机制解析 摘要:在BlueZ蓝牙协议栈二次开发中,90%的报错源于对编译产物类型和路径的混淆。本文系统剖析BlueZ的三阶段编译机制:1)配置阶段生成Makefile;2)编译阶段在.libs目录下产生临时库和可执行文件(不可直接运行);3)安装阶段将产物部署到系统标准路径。重点解析守护进程、命令行工具、动态库的核心路径差异,并针对五大高频问题(如临时库运行崩溃、动态库不匹配、系统覆盖等)给出解决方案。

byte轻骑兵的技术小窝 1万+

java 最大Topk 小跟堆 最小Topk 大跟堆 详解

java 最大Topk 小跟堆 最小Topk 大跟堆 详解

T_Y_F_的博客 826

uniapp(全端兼容)-最新详细实现接入腾讯云IM即时通讯教程,uniapp在安卓苹果app端/小程序/h5移动端等集成使用腾讯云im插件,提供消息列表与聊天对话示例,支持发图片/私聊/实时监听消息

uni-app,腾讯云IM,安卓app,苹果app,微信小程序,移动端,H5网页,手机网站,微信小程序、支付宝小程序,手机app端,nvue,im即时通讯,腾讯云IM详细教程,如何接入腾讯IM即时通讯,使用腾讯im有没有插件,怎么使用腾讯云IM插件,tim-wx-sdk,聊天sdk,即时通讯im uniapp私聊/群聊/聊天室,实现IM即时通讯仿微信聊天功能,对接腾讯云IM+音视频,调用腾讯即时通信IM的示例,卡顿很卡不流畅,音视频,全局监听,仿微信IM,uni-huanxin-im,sdk,实现多端实时通

✅ 精选推荐文章 1万+

拜托,面试别再问我TopK了!!!

前言:本文将介绍随机选择,分治法,减治法的思想,以及TopK问题优化的来龙去脉,原理与细节,保证有收获。 面试中,TopK,是问得比较多的几个问题之一,到底有几种方法,这...

架构师之路 8648

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

算法之美:堆排序原理剖析及应用案例分解实现

这段时间一直在持续更新关于二叉树的专栏文章,我相信小伙伴们对于二叉树的基本原理已经有了初步的了解。接下来,我将会更深入地探究二叉树的原理,并且展示如何将这些原理应用到更广泛的场景中去。文章将延续前面文章的风格,尽量精炼明了,减少冗长的废话,旨在简洁清晰地阐述二叉树的原理及其应用。让我们一起深入了解,并探索其潜在的价值吧!

猫步轻移,以学求知。余于此方寸之地,如猫观鼠,细察技艺所得,思维所悟。灵思如猫之警觉,日积月累,终成智海; 3014

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

堆排序在topK场景题中的应用及原理

堆排序在topK场景题中的应用及原理

梦~' 1251

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TopK--小顶堆

215.Kth Largest Element in an Array Medium 2280188FavoriteShare Find thekth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct...

qq_35747066的博客 314

TopK算法——基于小顶堆分析

215. 数组中的第K个最大元素 难度:中等 在未排序的数组中找到第k个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 力扣: https://leetcode-cn.com/problems/kth-...

longziling的博客 491

TopK问题求解方案讨论(时间复杂度,空间复杂度对比)

使用分治法 使用小顶堆

BigBug_500的博客 4063

如何寻找大数据流topK问题,终极方案!

详细解析如何查找海量数据的topK!

BarackYoung的博客 2303

topk--堆排序--小顶堆

【问题描述】 假设需要我们在一堆海量数据中找出排名前k的数据;最好的方法是用最小堆排序,直接用前k个数据建立一个小顶堆,然后遍历剩余的数, ①如果此数 ②如果此数>堆顶的数,则将此数和堆顶的数交换,然后从堆顶向下调整堆,使其重新满足小顶堆。 【说明】堆的存储 一般用数组来表示堆,第i个节点的父节点下标为i/2-1;它的左右节点下标分别为:2*i+1和2*1+2 【代码】

suibianshen2012的专栏 5714

面试经典的海量数据处理(TOPK)问题—转载+个人见解!

常见问题: ①Top K问题:分治+Trie树/Hash_map+小顶堆。采用Hash(x)%M将原文件分割成小文件,如果小文件太大则继续Hash分割,直至可以放入内存。 ②重复问题:BitMap位图 或 Bloom Filter布隆过滤器 或 Hash_set集合。每个元素对应一个bit处理。 ③排序问题:外排序 或 BitMap位图。分割文件+文件内排序+文件之间归并。

Much effort, much prosperity. 9917

排序与查找算法全解析:原理、实现与优化

系统梳理常见排序与查找算法的原理、实现、性能分析、工程优化与AI场景应用,结合面试高频题型、实战案例、常见陷阱、工程实践与前沿发展,助力算法面试与大数据/AI工程落地。掌握主流排序与查找算法原理、实现与性能分析注重工程优化与AI/大数据场景下的应用面试与实战并重,关注常见陷阱与前沿发展持续学习新型排序/查找技术,关注未来趋势。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 688

经典TopK的各种解法

问题描述:从arr[1]到arr[n]这n个数中,找出其中最大的k个数。 问题介绍 遇到在大规模数据处理中总会遇到“在海量数据中找出出现频率最高的前K个数据”之类的问题,这类问题被统称为TopK问题。优化解决TopK问题有助于我们在设计搜索引擎事实现热门关键词的排列,以及统计下载量等。 有一个1GB大小的文件,里面的每一行是一个词,词的大小不超过16个字节,内存限制大小是1MB。返回频数最高...

weixin_43887189的博客 1384

topk问题-堆排序

/** * @Description: topk问题-堆排序 * @Author: Jaryn * 1、使用前K个元素构成小顶堆 * 2、后k的元素如果大于堆顶元素,就交换,然后调整树 * @Date: 2019/11/21 14:57 */ public class TopK_HeapSort { public static void main(String[] args...

加号Jaryn 笔录 301

使用快速排序、堆和桶解决「TopK问题」(Python)

TopK问题即求解第K个最大or最小元素的问题,一般使用快排和堆来实现。

qq_40479372的博客 1334
上一篇: 第三章:查找与排序(下)----------- 3.23 相关题解:排序数组中找和的因子
下一篇: 第三章:查找与排序(下)----------- 3.27 用计数排序解决员工年龄问题
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值