取一个文件中最大的k个值(运行内存有限)

查找无序数中最大k个数 解法一:该解法是大部分能想到的,也是第一想到的方法。假设数据量不大,可以先用快速排序或堆排序,他们的平均时间复杂度为O(N*logN),然后取出前K个,时间复杂度为O(K),总的时间复杂度为O(N*logN)+O(K).         当K=1时,上面的算法的时间复杂度也是O(N*logN),上面的算法是把整个数组都进行了排序,而原题目只要求最大的K个数,并不需要前K个数有限,也不需要后N-K 阅读详情

我们只能利用10kb的运行空间去取一个有上万个数据甚至上亿个数据的文件时

如果使用冒泡排序和堆排序会很难实现

这时我们可以开辟一个大小为k的数组 将文件开头的数据放入数组中 将数据转化成小堆 所以数组第一个数据就是它所有数据中最小的数据 再将文件后面的数据 和数据比较 如果比数据第一个数据大 那么将这个数据移到数组第一个位置中 再变成小堆 再进行比较 再变小堆 一直持续到 文件数据被遍历完 这时 数组中的数据就是 文件中最大的k个数

 整体代码如下

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void heapdown(int* hp, int site ,int num)
{
	int parent = site;
	int child = parent * 2 + 1;
	while (child < num)
	{
		if (hp[child+1]>0 && hp[child]>hp[child + 1])
		{
			child++;
		}
		if (hp[parent]>hp[child])
		{
			int tmp = hp[parent];
			hp[parent] = hp[child];
			hp[child] = tmp;
		}
		else
		{
			break;
		}
		parent = child;
		child = parent * 2 + 1;
	}
}
//void heapsort(int* hp, int total)
//{
//	for (int i = (total - 1 - 1) / 2; i >= 0; i--)
//	{
//		heapdown(hp, i ,total);
//	}
//}
void Topk(int k)
{
	const char* file = "text.txt";
	FILE* fin = fopen(file, "r");
	int* arr = (int*)malloc(sizeof(int) * k);
	if (arr==NULL)
	{
		perror("malloc");
		return;
	}
	for (int i = 0; i < k; i++)
	{
		fscanf(fin, "%d", &arr[i]);
	}
	for (int i = (k - 1 - 1) / 2; i >= 0; i--)
	{
		heapdown(arr, i ,k);
	}
	int x = 0;
	while (fscanf(fin, "%d", &x)>0)
	{
		if (x>arr[0])
		{
			arr[0] = x;
		}
		for (int i = (k - 1 - 1) / 2; i >= 0; i--)
		{
			heapdown(arr, i, k);
		}
	}

	for (int i = 0; i < k; i++)
	{
		printf("%d ", arr[i]);
	}
	fclose(fin);
}
void createdate()
{
	int n = 100000;
	const char* file = "text.txt";
	FILE* fin = fopen(file, "w");
	if (fin == NULL)
	{
		perror("fopen");
		return;
	}
	for (int i = 0; i < n; i++)
	{
		int x = (rand()+i) % 10000000;
		fprintf(fin, "%d\n", x);
	}
	fclose(fin);
}
int main()
{

	srand((unsigned int)time(NULL));
	int num=10;
	scanf("%d", &num);
    //createdate();
	Topk(num);
}

K-Means(K-均值)、k-median聚类算法机器学习 聚类 聚类,简单来说,就是将一个庞杂数据集中具有相似特征的数据自动归类到一起,称为一个簇,簇内的对象越相似,聚类的效果越好。它是一种无监督的学习(Unsupervised Learning)方法,不需要预先标注好的训练集。聚类与分类最大的区别就是分类的目标事先已知,例如猫狗识别,你在分类之前已经预先知道要将它分为猫、狗两个种类;而在你聚类之前,你对你的目标是未知的,同样以动物为例,对于一个动物集来说,你并不清楚这个数据集内部有多少种类的动物,你能做的只是利用聚类方法将它自动按照特征分为多类,然后人为给出这个 阅读详情

相关推荐

C语言,从升序方幂数列中求得具体项数的值的解法

给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,… (该序列实际上就是:30,31,30+31,32,30+32,31+32,30+31+32,…) 请你求出这个序列的第N项的值(用10进制数表示)。 例如,对于k=3,N=100,正确答案应该是981。 代码如下:

FengGLA的博客 1290

K折交叉验证中K值的计算方法

本文系统探讨了K折交叉验证中K值选择的理论与方法。首先阐述K折交叉验证的基本原理,即将数据集划分为K个子集进行重复训练验证。核心部分分析了K值对偏差与方差的影响:小K值计算成本低但方差大,大K值偏差小但计算成本高。随后介绍经典K值选择方法,包括经验法(如常用K=5或10)、基于偏差-方差分解的理论方法,以及动态K值选择和优化算法(网格搜索、随机搜索、贝叶斯优化)。文章强调K值选择需权衡计算成本与模型评估精度,并提供了实际代码示例说明不同优化方法的应用。

FPGA/MATLAB学习教程/源码/项目合作开发 1972

最强解析面试题:在无序数组中取最大的K个数「建议收藏!」

这是面试中最大概率会问的一道题,总结之前的面经,加上借鉴牛人的观点,总结如下:一、当无序数组元素个数数量级不高的情况下,对数组进行排序,如果用最快的排序快速排序,时间复杂度为O(nlogn),排序结束后取其前K个元素,时间复杂度为常量,总体时间复杂度为O(nlogn)。这是最容易想到的解决方法。但要求取前K个最大元素,并没有要求其有序,在上述方法中,是对数组所有元素进行了排序的,包括N-K、和K个元

魏小言的博客 3332

【深度学习】KMeans中自动K值的确认方法

注意,即使在数据上聚类特征最明显,也并不意味着聚类结果就是有效的,因为这里的聚类结果用来分析使用,不同类别间需要具有明显的差异性特征并且类别间的样本量需要大体分布均衡。KMeans是聚类方法中非常常用的方法,并且在正确确定K的情况下,KMeans对类别的划分跟分类算法的差异性非常小,这也意味着KMeans是一个准确率非常接近实际分类的算法。对于不同类别的典型特征的对比,除了使用雷达图直观的显示外,还可以使用多个柱形图的形式,将每个类别对应特征的值做柱形图统计,这样也是一个非常直观的对比方法。

TwcatL 2135

RC滤波电路实战解析:无源与有源设计的性能对比与应用选择

本文深入解析了RC滤波电路的核心原理,重点对比了无源滤波电路与有源滤波电路的性能差异。文章通过实测波形与仿真数据,详细阐述了两者在带载能力、频率响应精度、噪声特性等方面的优劣,并提供了清晰的应用选择指南,帮助工程师根据信号属性、负载条件和性能要求做出最优设计决策。

weixin_29268637的博客 431

终端里藏了个AI大神!DeepSeek‑TUI让你的命令行直接起飞

DeepSeek-TUI:终端AI编程神器 DeepSeek-TUI是一款专为开发者设计的终端AI编程工具,基于DeepSeek V4模型,提供100万Token超大上下文支持,适合处理复杂项目。其核心优势包括: 轻量高效:单二进制文件,无需依赖环境,支持SSH远程操作 智能交互:实时流式输出推理过程,支持三档模式(Plan/Agent/YOLO)灵活切换 强大功能:集成文件读写、Git管理、Shell执行等工具,支持一键回滚和持久会话 节省成本:智能压缩与缓存优化,显著降低Token消耗 适用于服务器开发

968

【机器学习】KNN算法及K值的选取

KNN算法及K值的选取

weixin_46564151的博客 1万+

STM32 bootloader程序跳转到APP卡死在B_ENDP_ALIGN,原因:有未处理的中断。解决方法:重启系统

Bootloader和App中都用到了串口,定时器等,所以从Bootloader跳转App后未卡死。 后来写的另一个App里没有用到这几个外设,然后就是无限的卡死。 现在Bootloader中跳转App之前将已打开的外设关掉,再跳转至App就不再出现卡死。  if(((*(vu32*)(APPLICATION_ADDRESS+4))&0xFF000000)==0x08000000) {

jingzhixingyun的博客 7921

**KMeans中自动K值的确认方法**

KMeans中自动K值的确认方法 1 前言 聚类常用于数据探索或挖掘前期,在没有做先验经验的背景下做的探索性分析,也适用于样本量较大情况下的数据预处理等方面工作。例如针对企业整体用户特征,在未得到相关知识或经验之前先根据数据本身特点进行用户分群,然后再针对不同群体做进一步分析;例如将连续数据做离散化,便于做后续分类分析应用。 KMeans是聚类方法中非常常用的方法,并且在正确确定K的情况下,KM...

weixin_45506253的博客 3389

《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)

《C++面向对象程序设计》✍千处细节、万字总结 文章目录《C++面向对象程序设计》✍千处细节、万字总结一、面向对象程序设计二、C++基础2.1 C++的产生和特点2.2 一个简单的C++示例程序2.3 C++在非面向对象方面对C语言的扩充输入和输出cinconst修饰符void型指针内联函数带有默认参数值的函数函数重载作用域标识符"::"强制类型转换new和delete运算符引用三、类和对象(一)3.1 类的构成3.2 成员函数的定义3.3 对象的定义和使用3.4 构造函数与析构函数构造函数成员初始化列表

像写诗一样优雅地写代码~ 78万+

SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行

本文是ABAP开发入门指南,详细介绍如何创建并运行第一个"Hello World"程序。主要内容包括:通过SE38事务码进入ABAP编辑器;创建以Z/Y开头的程序并保存为本地对象;编写简单的WRITE输出语句;完成语法检查、激活和执行流程;以及初步体验调试功能。文章特别强调ABAP开发的规范要求,如程序命名规则、激活与保存的区别等,并提供了详细的步骤说明和常见问题提示,帮助零基础开发者快速上手ABAP编程。

baidu_35680696的博客 483

LeetCode题解:数组的最大美丽值

好久没打力扣周赛了,今天做了下,以前都是可以肝三个题的,今天第二题就卡住了😭😭😭 下面我就浅浅分析下这个题吧,我一定能给你讲明白的😀😀😀

小知识吖 3万+

如何免费快速的部署一个自用免VIP的自动追剧工具!NAS新玩法!豆瓣与迅雷结合,轻松实现自动下载电影自动追剧功能(支持Windows,群晖nas,飞牛nas,软路由,服务器等Docker快速部署)

追剧党狂喜!豆瓣追剧神器,自动添加云盘,自动下载,微信通知,一键搞定!

XiaoqiangClub的博客 4590

[转载]「交叉验证」到底如何选择K值?

「交叉验证」到底如何选择K值? 原文链接:https://cloud.tencent.com/developer/article/1410946 交叉验证(cross validation)一般被用于评估一个机器学习模型的表现。更多的情况下,我们也用交叉验证来进行模型选择(model selection)。往远了说,交叉验证可以用于评估任何过程,但本文仅讨论机器学习评估这个特定领域。 交叉验证有很长的历史,但交叉验证的研究有不少待解决的问题。拿最简单的K折交叉验证来说,如何选择K就是一个很有意思的话题。而更

出门左拐是海的博客 3226

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2978

OpenCV计算机视觉实战(11)——边缘检测详解

在本节中,我们系统介绍了三大经典边缘检测算子,包括 Sobel 算子:一阶导数平衡了噪声抑制与边缘提取,结合方向信息可用于纹理分析与车道检测;Laplacian 算子:二阶导数对微小亮度突变尤为敏感,配合零交叉和细化技术,可精确捕捉任意方向的细节边缘;Canny 算法:集成多阶段处理与双阈值策略,通过多尺度融合与自适应阈值优化,达到抗噪与细节兼顾的卓越效果。

qq_30167691的博客 4377

机器学习实验二 K折交叉验证找最佳K值并可视化分析

一、实验目的: (1)K折交叉验证是一种常用的模型评估方法,它可以在有限的数据下充分利用数据集,提高模型精度和泛化能力。K折交叉验证将数据集分成K个互不重叠的子集,每次选取其中一个子集作为测试集,剩余K-1个子集作为训练集,然后计算模型在测试集上的误差,重复该过程K次,最终得到K个误差值的平均数作为模型的性能指标。 (2)寻找最佳的K值可以通过在一定范围内遍历K值,比较不同K值下模型的性能指标来确定最佳的K值。比如,可以从2开始尝试不同的K值,直到最大的K值等于数据集大小。通常情况下,K的取值范围应该保证

xqmids99的博客 3723

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

线性基-求异或最大,最小,第K小

定义: 基:在线性代数中,基(也称为基底)是描述、刻画向量空间的基本工具。向量空间的基是它的一个特殊的子集,基的元素称为基向量。向量空间中任意一个元素,都可以唯一地表示成基向量的线性组合。如果基中元素个数有限,就称向量空间为有限维向量空间,将元素的个数称作向量空间的维数。 同样的,线性基是一种特殊的基,它通常会在异或运算中出现,它的意义是:通过原集合S的某一个最小子集S1使得S1内元素相互异或...

weixin_43154720的博客 4421

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

寻找最大的K个数

寻找最大的K个数

Jarvan_Song的博客 1027

《编程之美》2.5寻找最大的K个数

问题:有很多个无序的数(假设为N个),怎么选出其中最大的K个数? Kays word:kay的理解:“很多” == 好多好多,无法存储,因此首先排除了对输入数排序的解法,而采用小容量数组整理大的输入数据,即:开大小为K的数组,通过遍历N个输入数组,每遍历一个数num,检查K数组的最小数,如果比num小,则用num替换。最终完成K个最大数的提取。代码如下:#include

602

K-近邻算法(KNN算法)的K值的选取--交叉验证+网格搜索

摘要:KNN算法中K值选择直接影响模型性能,需通过交叉验证和网格搜索进行优化。交叉验证通过多次数据划分评估模型泛化能力,避免过拟合;网格搜索则系统遍历参数组合寻找最优解。二者协同工作流程包括:定义参数网格、遍历参数组合、交叉验证评分、选择最优参数及最终测试评估。案例展示了如何使用交叉验证评估K值性能,网格搜索优化多参数(K值、权重、距离度量),并可视化结果。这种方法能有效平衡偏差-方差,提升模型在新数据上的预测能力。

freed_Day的博客 1467

找出最大的k个数

这是一个算法中很常见的问题,遇到这个题开始像我这种还未养成算法思维的人,第一想法就是先排序然后直接去前K个大的数就好。 但居然在笔试中遇到这个题,那最最普通的这种解法肯定肯定是无法满足结果的。 而且一旦数据量一大,即便排序效率高也需要花上不少时间。这里不再谈普通的解决方法。 第二种解法是利用快排算法,做相应改变,执行有限次数获取前K大的数。 假设N个数存储在集合S中,从S中 随机 取一个数X,...

Zen@sz 博客 1692

花园美学与算法优化:如何用有限的花朵打造最大美丽值?

"花园的最大总美丽值"问题生动展示了如何将现实世界的资源分配问题转化为可计算的优化模型。多目标权衡的数学建模方法排序+贪心+二分的复合算法策略前缀和优化在区间计算中的应用大数值范围下的算法设计考量更重要的是,这个问题提醒我们:在资源有限的世界中,最优解往往需要在"锦上添花"与"雪中送炭"之间找到精妙平衡。如同园艺,优秀的算法设计既需要严谨的数学思维,也需要对问题本质的深刻理解。算法不仅仅是冰冷的代码,更是解决现实问题的思维工具。从花园美化到城市管理,从资源分配到战略规划,优化思维无处不在。

司徒鸿的博客 811

海量数据有限内存系列问题解决方案

分而治之,基于hash映射切分数据存在性判断,采用set、前缀树、或者布隆过滤器频率统计,采用hash、前缀树排序,外部排序,例如归并排序top-k,堆排序切分数据后,就可以使用多进程或多线程,让每一个进程或者线程负责处理部分数据,由主进程或者主线程聚合结果若为分布式场景,基于MapReduce。

予早随笔 886

如何高效管理Powerlevel10k:有限支持下的终极配置指南

Powerlevel10k是一款功能强大的Zsh主题,以其高度可定制性和出色的性能深受开发者喜爱。尽管目前处于有限支持状态,用户仍可通过合理配置和自我管理充分发挥其潜力,打造个性化的终端体验。 ## 认识Powerlevel10k的核心价值 Powerlevel10k作为一款流行的Zsh主题,最大特色在于其丰富的样式选择和高效的Git状态显示。通过直观的视觉设计,它能实时展示当前目录、Git分

gitblog_00957的博客 474
上一篇: 堆排序(向下调整)
下一篇: 数组选择排序
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值