103.【C语言】数据结构之TopK问题详细分析

目录

1.定义

2.实现

一个容易想到的方法

稍微改进的方法

最优的方法

分析方法的可行性

取出无序数组的取出前K个元素有几种可能

1.取的全是非TopK个元素中的

2.取的前K个既有非TopK个元素也有TopK个元素

3.取的前K个q恰为TopK个元素

代码实现

步骤

TestTopK代码

PrintTopK的代码

运行结果

3.手动测试

1.使用Access测试

1.运行代码一次,data.txt做后用

2.打开Access,创建空白桌面数据库

3.将data.txt导入到数据库

4.创建查询

2.修改data.txt后测试

1.运行代码一次,data.txt做后用

2.手动修改data.txt

3.修改main.c

4.执行代码,查看结果


1.定义

TopK即排名位于前K个(按从大到小或从小到大排序)

2.实现

一个容易想到的方法

先将无序数组中所有的元素载入内存,再建大堆

但此方法有缺陷,如果数组元素个数过大,比如N=100亿,设以int类型存储,则粗略计算总大小

100亿-->4*10^{10}byte-->4*10^{10}/(1024*1024*1024)GB-->1024\approx10^3-->

约为40GB

 实际上一个进程不可能分配40GB的内存,因此无法存储

稍微改进的方法

将大数组拆分为多个小数组,再对每个小数组建大堆,取出前K个即可

最优的方法

先取出无序数组的取出前K个元素,对它们建堆(这里非常关键),再遍历剩下的(N-K)个元素,如果某个元素的值比堆顶的值要大,就替代堆顶元素,接着向下调整建小堆,反复执行前述过程,最后这个含有K个元素的小堆就是TopK个

分析方法的可行性

取出无序数组的取出前K个元素有几种可能
1.取的全是非TopK个元素中的

说明TopK个元素全在剩下的(N-K)个元素中,由于小堆中的堆顶元素是堆中最小的,因此TopK个元素一定可以进入小堆中替换原来的元素

最后这个小堆的数据一定是最大的前K个

2.取的前K个既有非TopK个元素也有TopK个元素

分析同上,不再赘述 

3.取的前K个q恰为TopK个元素

分析同上,不再赘述

代码实现

步骤

1.生成大量随机数写入(fprintf)文件中

2.将TopK个的结果输出

TestTopK代码
void TestTopK()
{int n = 10000;//设置10000个随机数const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen");return;}srand((unsigned int)time(NULL));//设置种子for (int i = 0; i < n; i++){int x = rand() % 10000;//生成1~9999内的随机数fprintf(fin, "%d\n", x);//以文本模式写入文件}fclose(fin);fin = NULL;PrintTopK(file,10);
}
PrintTopK的代码

1.为前K个元素开辟空间 

2.打开文件

3.读取前K个元素,放入文件中

4.遍历剩下的(N-K)个元素,多次向下调整

void PrintTopK(const char* file,int K)
{//为前K个元素开辟空间 int* topk = (int*)malloc(sizeof(int) * K);if (topk == NULL){perror("malloc");return;}//打开文件FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen");return;}//从流中读取前K个元素for (int i = 0; i < K; i++){fscanf(fout, "%d", &topk[i]);}//前K个元素建小堆for (int i = (K - 1 - 1) / 2; i >= 0; i--){AdjustDown(topk, K, i);}//将剩余(N-K)个与堆顶元素比较,满足条件则替换,每换一次则向下调整一次int val = 0;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);}fclose(fout);//打印TopK个for (int i = 0; i < K; i++){printf("%d\n", topk[i]);}
}

运行结果

怎么知道代码执行是否无误呢?需要手动测试

3.手动测试

1.使用Access测试

1.运行代码一次,data.txt做后用

2.打开Access,创建空白桌面数据库

3.将data.txt导入到数据库

选择文本文件

 浏览找到data.txt,选择"将源数据导入当前数据库的新表中

点下一步

 点下一步

点下一步

点下一步

点完成

点关闭

双击表Data,查看数据是否导入,检查后确实导入了10000个数据

4.创建查询

创建-->查询设计

添加表Data

 

双击字段1

排序里选择降序

单击运行

查看排名靠前的10个数和程序的运行结果是否符合

发现完全符合,程序运行无误

2.修改data.txt后测试

1.运行代码一次,data.txt做后用

2.手动修改data.txt

随机选取10个数将它们改成6位数,保存data.txt

3.修改main.c

TestTopK函数只保留const char* file = "data.txt";和PrintTopK(file,10);语句,其他语句注释掉

4.执行代码,查看结果

发现完全符合,程序运行无误

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

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

相关文章

国土变更调查拓扑错误自动化修复工具的研究

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、拓扑错误的形成原因 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭长 5.细小碎面 6.更新层相互重叠 二、修复成果展示 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭…

【C++ 算法进阶】算法提升二十三

目录 左右数组相减绝对值最大值 &#xff08;题意代换&#xff09;题目题目分析 可整合数组 &#xff08;题意代换&#xff09;题目题目分析代码 水王问题题目题目分析代码水王问题变形思路讲解 合并石头的最低成本 &#xff08;动态规划&#xff09;题目题目分析代码 左右数组…

质量留住用户:如何通过测试自动化提供更高质量的用户体验

在当今竞争异常激烈的市场中&#xff0c;用户手头有无数种选择&#xff0c;但有一条真理至关重要&#xff1a; 质量留住用户。 产品的质量&#xff0c;尤其是用户体验 (UX)&#xff0c;直接决定了客户是留在您的品牌还是转而选择竞争对手。随着业务的发展&#xff0c;出色的用户…

Redis 可观测最佳实践

Redis 介绍 Redis 是一个开源的高性能键值对&#xff08;key-value&#xff09;数据库。它通常用作数据库、缓存和消息代理。Redis 支持多种类型的数据结构&#xff0c;Redis 通常用于需要快速访问的场景&#xff0c;如会话缓存、全页缓存、排行榜、实时分析等。由于其高性能和…

idea怎么打开两个窗口,运行两个项目

今天在开发项目的时候&#xff0c;前端希望运行一下以前的项目&#xff0c;于是就需要开两个 idea 窗口&#xff0c;运行两个项目 这里记录一下如何设置&#xff1a;首先依次点击&#xff1a; File -> Settings -> Appearance & Behavior ->System Settings 看到如…

加速科技精彩亮相中国国际半导体博览会IC China 2024

11月18日—20日&#xff0c;第二十一届中国国际半导体博览会&#xff08;IC China 2024&#xff09;在北京国家会议中心顺利举办&#xff0c;加速科技携重磅产品及全系测试解决方案精彩亮相&#xff0c;加速科技创始人兼董事长邬刚受邀在先进封装创新发展论坛与半导体产业前沿与…

JSON 性能测试 - WastJson 性能也很快

WAST 是一个高性能 Java 工具集库包&#xff0c;包括 JSON、YAML、CSV、HttpClient、JDBC 和 EL 引擎. WastJson 无论是小中大文本各种数据类型等性能都没有明显的短板&#xff0c;除了推广外可以说是六边形战士&#xff0c;更多测试参考 wast-jmh-test: wast性能测试 (并非所…

【小白学机器学习34】用python进行基础的数据统计 mean,var,std,median,mode ,四分位数等

目录 1 用 numpy 快速求数组的各种统计量&#xff1a;mean, var, std 1.1 数据准备 1.2 直接用np的公式求解 1.3 注意问题 1.4 用print() 输出内容&#xff0c;显示效果 2 为了验证公式的后背&#xff0c;下面是详细的展开公式的求法 2.1 均值mean的详细 2.2 方差var的…

视频推拉流EasyDSS互联网直播点播平台技术特点及应用场景剖析

在数字科技日新月异的今天&#xff0c;视频直播和点播已经成为互联网内容传播的重要方式之一。而互联网直播点播平台EasyDSS作为功能强大的流媒体直播点播视频能力平台&#xff0c;提供了一站式的视频推拉流、转码、直播、点播、时移回放、存储等视频服务&#xff0c;广泛应用于…

【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!

一、前言 Apache JMeter是纯Java的开源软件&#xff0c;最初由Apache软件基金会的Stefano Mazzocchi开发&#xff0c;旨在加载测试功能行为和测量性能。可以使用JMeter进行性能测试&#xff0c;即针对重负载、多用户和并发流量测试Web应用程序。 我们选择JMeter原因 是否测试过…

ffmpeg视频滤镜:提取缩略图-framestep

滤镜描述 官网地址 > FFmpeg Filters Documentation 这个滤镜会间隔N帧抽取一帧图片&#xff0c;因此这个可以用于设置视频的缩略图。总体上这个滤镜比较简单。 滤镜使用 滤镜参数 framestep AVOptions:step <int> ..FV....... set frame st…

Spring源码(十三):Spring全系列总结

Spring总结篇,不同于之前抽丝剥茧式地纵向深入源码,本次从横向的角度出发,希望可以带个读者一个完全不同的Spring视角。 2024年重置版,搞点不一样的东西。希望通过本篇的内容,将之前的文章全部给串起来。 相关前文: Spring Boot启动加载Spring Web请求处理流程Spring上…

【AIGC】如何准确引导ChatGPT,实现精细化GPTs指令生成

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | 提示词Prompt应用实例 文章目录 &#x1f4af;前言&#x1f4af;准确引导ChatGPT创建爆款小红书文案GPTs指令案例&#x1f4af; 高效开发GPTs应用的核心原则明确应用场景和目标受众构建多样化风格模板提问与引…

电影风格城市夜景旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 电影风格城市夜景旅拍通过 Lightroom 调色&#xff0c;将城市夜晚的景色打造出如同电影画面般的质感和氛围。以独特的色彩和光影处理&#xff0c;展现出城市夜景的魅力与神秘。 预设信息 调色风格&#xff1a;电影风格预设适合类型&#xff1a;人像&#xff0c;街拍…

拥抱极简主义前端开发:NoCss.js 引领无 CSS 编程潮流

在前端开发的世界里&#xff0c;我们总是在不断追寻更高效、更简洁的方式来构建令人惊艳的用户界面。而今天&#xff0c;我要向大家隆重介绍一款具有创新性的工具 ——NoCss.js&#xff0c;它将彻底颠覆你对传统前端开发的认知&#xff0c;引领我们进入一个全新的无 CSS 编程时…

【JavaEE初阶】多线程初阶下部

文章目录 前言一、volatile关键字volatile 能保证内存可见性 二、wait 和 notify2.1 wait()方法2.2 notify()方法2.3 notifyAll()方法2.4 wait 和 sleep 的对比&#xff08;面试题&#xff09; 三、多线程案例单例模式 四、总结-保证线程安全的思路五、对比线程和进程总结 前言…

使用 前端技术 创建 QR 码生成器 API1

前言 QR码&#xff08;Quick Response Code&#xff09;是一种二维码&#xff0c;于1994年开发。它能快速存储和识别数据&#xff0c;包含黑白方块图案&#xff0c;常用于扫描获取信息。QR码具有高容错性和快速读取的优点&#xff0c;广泛应用于广告、支付、物流等领域。通过扫…

vxe-modal VxeUI 窗口组件弹窗多窗口模式

VxeUI 实现在 vue 中使用弹窗组件&#xff0c;弹窗多个窗口可叠加&#xff0c;实现多实例的窗口组件。 npm install vxe-pc-ui4.3.6// ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...createApp(App).use(VxeUI).mount(#app)// ...官网&#xff1a;https…

无人机探测:光电侦测核心技术算法详解!

核心技术 双光谱探测跟踪&#xff1a; 可见光成像技术&#xff1a;利用无人机表面反射的自然光或主动光源照射下的反射光&#xff0c;通过高灵敏度相机捕捉图像。该技术适用于日间晴朗天气下的无人机探测&#xff0c;具有直观、易于识别目标的特点。 红外成像技术&#xff1…

【ArcGISPro】Sentinel-2数据处理

错误 默认拉进去只组织了4个波段,但是实际有12个波段 解决方案 数据下载 Sentinel-2 数据下载-CSDN博客 数据处理 数据查看 创建镶嵌数据集 在数据管理工具箱中找到创建镶嵌数据集