TopK问题与堆排序

目录

TopK问题:

定义:

应用场景:

搜索引擎:

推荐系统:

数据分析:

数据挖掘:

TopK问题初阶:(数据量较小情况)

TopK问题进阶:(数据量较大情况)

堆排序:

堆排序排升序:

建小堆:

建大堆:

堆排序排降序:

建大堆:

建小堆:


TopK问题:

定义:

TopK问题即求数据集合中前K个最大的元素或者最小的元素。

应用场景:

搜索引擎

在搜索引擎中,TopK问题可以用于返回用户查询的前K个最相关的搜索结果

推荐系统

在电子商务网站或媒体流推荐中,可以使用TopK问题来提供用户最感兴趣的产品或内容。

数据分析

在大数据分析中,TopK问题可用于查找最频繁出现的元素或最高价值的数据点。

数据挖掘

在聚类和分类问题中,可以使用TopK问题来选择具有最高重要性的特征或数据点。

TopK问题初阶:(数据量较小情况)

假设从M中个数据选出前N个大的(小的)数据,需要先对M个数据建堆,对于堆结构使用取堆顶数据算法(HeapTop)再将最后一个元素移到第一个元素的位置,再使用向上调整(Adjustup)/向下调整算法(Adjustdown),不断执行这个过程N次,便可得到前N个大的(小的)数据。

void AdjustUp(HeapDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (child - 1) / 2;}else{break;}}
}void Adjustdown(HeapDataType* a, int n, int parent)
{size_t child = parent * 2 + 1;while (child < n){if (child + 1 < n && a[child + 1] < a[child]){child++;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);parent = child;child = parent * 2 + 1;}else{break;}}
}HeapDataType HeapTop(HP* php)
{assert(php);return php->a[0];
}

TopK问题进阶:(数据量较大情况)

TopK问题初阶的解决方法仅适用于M小的情况,如果M的数据量较大,则TopK问题初阶算法不再试用。假设M为10亿,对于M数据量建堆需要消耗约40个G的内存,此时内存不够用,可以使用硬盘存储,但还有更加简单的方法。

可以先对前N个数据建堆,若想取出前N个大的数据,则应该建立小堆,将后续的(M-N)个数据不断与堆顶数据进行比较,如果数据大于堆顶元素,则将数据与堆顶元素进行交换,并使用向下调整算法使堆保持小堆结构,最后小堆内剩下的N个数据就是M个数据内想取出的前N个数据。

若想取出前N个小的数据,则应该建立大堆,将后续的(M-N)个数据不断与堆顶数据进行比较,如果数据小于堆顶元素,则将数据与堆顶元素进行交换,并使用向下调整算法使堆保持大堆结构,最后大堆内剩下的N个数据就是M个数据内想取出的前N个数据。

时间复杂度:N+(M-N)logK—>N

void CreateNDate()
{// 造数据int n = 100000;srand(time(0));const char* file = "data.txt";FILE* fin = fopen(file, "w");if (fin == NULL){perror("fopen error");return;}for (int i = 0; i < n; ++i){int x = (rand()+i) % 1000000;fprintf(fin, "%d\n", x);}fclose(fin);
}//前k个数据为例
void topk()
{printf("请输入k:>");int k = 0;scanf("%d", &k);const char* file = "data.txt";FILE* fout = fopen(file, "r");if (fout == NULL){perror("fopen error");return;}int val = 0;int* minheap = (int*)malloc(sizeof(int) * k);if (minheap == NULL){perror("malloc error");return;}for (int i = 0; i < k; i++){fscanf(fout, "%d", &minheap[i]);}// 建k个数据的小堆for (int i = (k - 1 - 1) / 2; i >= 0; i--){AdjustDown(minheap, k, i);}int x = 0;while (fscanf(fout, "%d", &x) != EOF){// 读取剩余数据,比堆顶的值大,就替换他进堆if (x > minheap[0]){minheap[0] = x;AdjustDown(minheap, k, 0);}}for (int i = 0; i < k; i++){printf("%d ", minheap[i]);}fclose(fout);}

堆排序:

堆排序排升序:

建小堆:

堆顶元素即为整个数据内最小元素,但后部元素只有孩子大于父亲的关系,没有孩子与孩子之间的关系,所以如果使用建小堆实现堆排序升序则需对于剩下的元素再进行建堆。

时间复杂度为N*logN

void HeapSort(int* a, int n)
{// a数组直接建堆 O(N)for (int i = (n-1-1)/2; i >= 0; --i){AdjustDown(a, n, i);}// O(N*logN)int end = n - 1;while (end > 0){Swap(&a[0], &a[end]);AdjustDown(a, end, 0);--end;}
}

建大堆:

对于整个数据建立大堆,将堆顶元素与最后一个元素调换位置,此时最大的元素就处于正确的位置,再对于除去最后一个元素的剩余元素进行向下调整选出次大的数据,不断重复此过程即可完成堆结构元素数据的升序排序。

堆排序排降序:

建大堆:

堆顶元素即为整个数据内最大元素,但后部元素只有孩子小于父亲的关系,没有孩子与孩子之间的关系,所以如果使用建大堆实现堆排序升序则需对于剩下的元素再进行建堆。

时间复杂度为N*logN

建小堆:

对于整个数据建立小堆,将堆顶元素与最后一个元素调换位置,此时最小的元素就处于正确的位置,再对于除去最后一个元素的剩余元素进行向下调整选出次小的数据,不断重复此过程即可完成堆结构元素数据的升序排序。

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

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

相关文章

知名品牌因商标痛失市场:114家直营店山寨店7000多家!

奶茶知名品牌“鹿角巷”当年红遍大江南北&#xff0c;是最早的新茶饮品牌&#xff0c;但是当年商标注册存在问题&#xff0c;被同行奶茶品牌抢占了先机&#xff0c;发声明“对大陆商标注册细则不详&#xff0c;在商标注册过程中让假店钻了法律空档”&#xff0c;最夸张的时候全…

qml required property

目录 前言 示例代码 创建一个自定义组件&#xff08;MyComponent.qml&#xff09; 使用自定义组件&#xff08;main.qml&#xff09; 解释 运行效果 运行时错误示例 前言 在 QML 中&#xff0c;你可以使用 required 关键字来声明一个属性是必需的。这意味着在创建该对象…

如何用Python向PPT中批量插入图片

办公自动化办公中&#xff0c;Python最大的优势是可以批量操作&#xff0c;省去了用户粘贴、复制、插入等繁琐的操作。经常做PPT的朋友都知道&#xff0c;把图片插入到PPT当中的固定位置是一个非常繁琐的操作&#xff0c;往往调整图片时耗费大量的时间和精力。如何能省时省力插…

【数据结构】使用C语言 从零实现一个栈的数据结构

栈 什么是栈&#xff1f;栈是一种特殊的线性表&#xff0c;它只能在在表尾进行插入和删除操作。 栈的底部称为栈底&#xff0c;顶部称为栈顶&#xff0c;所有的操作只能在栈顶进行&#xff0c;也就是说&#xff0c;被压在下方的元素&#xff0c;只能等待其上方的元素出栈之后…

LeetCode-简单-回文数

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数 是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xff0c;121 是回文&#xff0c;…

windows启动Docker闪退Docker desktop stopped

Windows启动Docker闪退-Docker desktop stopped 电脑上很早就安装有Docker了&#xff0c;但是有一段时间都没有启动了&#xff0c;今天想启动启动不起来了&#xff0c;打开没几秒就闪退&#xff0c;记录一下解决方案。仅供参考 首先&#xff0c;参照其他解决方案&#xff0c;本…

Ubuntu20安装mysql方法,适用于wsl

itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源&#xff0c;拥抱国产化 一、Ubunt20安装mysql 适用于wsl中安装mysql sudo apt update# 查看可使用的安装包…

【刷题汇总--游游的you、腐烂的苹果、孩子们的游戏(圆圈中最后剩下的数)】

C日常刷题积累 今日刷题汇总 - day0051、游游的you1.1、题目1.2、思路1.3、程序实现 - 蛮力法1.4、程序实现 - 贪心(优化) 2、腐烂的苹果2.1、题目2.2、思路2.3、程序实现 - bfs 3、孩子们的游戏(圆圈中最后剩下的数)3.1、题目3.2、思路3.3、程序实现 -- 环形链表3.4、程序实现…

2个方法教你轻松移除pdf文件编辑限制

PDF是一种常见的办公文档格式&#xff0c;常用于文件共享和保护。然而&#xff0c;有时候我们需要编辑PDF文件中的内容&#xff0c;但受到了编辑限制。本文将介绍一些有效的方法&#xff0c;帮助您解除PDF的编辑限制&#xff0c;轻松进行编辑和修改。 一、通过密码取消PDF“限制…

雷电模拟器报错remount of the / superblock failed: Permission denied remount failed

报错截图 解决方法 打开设置 设置配置system.vmdk可写入 解决

Transformer和Mamba强强结合!最新混合架构全面开源,推理速度狂飙8倍

最近发现&#xff0c;将Mamba和Transformer模块混合使用&#xff0c;效果会比单独使用好很多&#xff0c;这是因为该方法结合了Mamba的长序列处理能力和Transformer的建模能力&#xff0c;可以显著提升计算效率和模型性能。 典型案例如大名鼎鼎的Jamba&#xff1a;Jamba利用Tr…

ELK优化之Elasticsearch

目录 1.ELK优化 2.优化 ES 索引设置 2.1 优化 fsync 2.2 优化 refresh 2.3 优化 merge 2.4 优化设置 2.5 打开索引 3.优化线程池配置 3.1 优化的方案 4.锁定内存&#xff0c;不让 JVM 使用 Swap 5.减少分片数、副本数 6.ES优化总结 1.ELK优化 ELK优化可以围绕着 li…

Python统计实战:时间序列分析之简单指数平滑和Holt指数平滑

为了解决特定问题而进行的学习是提高效率的最佳途径。这种方法能够使我们专注于最相关的知识和技能&#xff0c;从而更快地掌握解决问题所需的能力。 &#xff08;以下练习题来源于《统计学—基于Python》。请在Q群455547227下载原始数据。&#xff09; 练习题 下表是某只股票…

二维平面无中心点的聚类算法

问题描述 二维平面上有许多点p(x , y)&#xff0c;按照彼此之间的欧式距离进行分为若干个集合。若点p1(x1, y1)与点p(x2, y2)之间距离小于d,则认为二者是邻居。 算法思路 给数据集的点进行编号&#xff0c;顺序遍历这些点&#xff0c;找出当前点的邻居&#xff0c;记住已经遍…

模具监视器的选择要点介绍

模具监视器的选择要点涉及多个方面&#xff0c;以确保其能够满足实际生产需求并提高生产效率。以下是一些关键的选择要点&#xff1a; 一、性能和稳定性 监控精度&#xff1a;选择模具监视器时&#xff0c;首先要考虑其监控精度&#xff0c;包括温度、压力、注射速度等参数的…

Debezium系列之:JVM参数详解和Debezium集群JVM监控看板制作

Debezium系列之:JVM参数详解和Debezium集群JVM监控看板制作 一、JVM参数详解1.jvm_memory_bytes_used2.jvm_memory_bytes_committed3.jvm_memory_bytes_max4.jvm_memory_bytes_init5.jvm_memory_pool_bytes_used6.jvm_memory_pool_bytes_committed7.jvm_memory_pool_bytes_max…

金属3D打印如何精准选材

随着3D打印技术的飞跃发展&#xff0c;模具制造领域迎来了前所未有的创新机遇。在众多3D打印技术中&#xff0c;SLM金属3D打印以其精度高、复杂结构成型能力&#xff0c;成为众多行业的优选。然而&#xff0c;金属打印材料&#xff0c;如何精准选择&#xff0c;以最大化满足项目…

linux 内核打印log太多咋办?

有时候发现&#xff0c;linux 内核打印太多消息了&#xff0c;对有用消息造成了干扰&#xff0c;如果你一个个源文件去关闭打印太麻烦了&#xff0c;有没有一种更方便的方式来关闭这些消息呢&#xff1f; 对这个需求&#xff0c;内核提供了一个强大而又灵活的方式&#xff0c;…

开源 WAF 解析:选择最适合你的防护利器

前言 随着网络安全风险的增加&#xff0c;Web 应用防火墙&#xff08;WAF&#xff09;成为保护网站和应用程序免受攻击的关键工具。在众多的选择中&#xff0c;开源 WAF 以其灵活性、可定制性和成本效益备受青睐。本文将深入探讨几种主流开源 WAF 解决方案&#xff0c;帮助你选…

用html+css设计一个列表清单小卡片

目录 简介: 效果图: 源代码: 可能的问题: 简介: 这个HTML代码片段是一个简单的列表清单设计。它包含一个卡片元素(class为"card"),内部包含一个无序列表(ul),列表项(li)前面有一个特殊的符号(△)。整个卡片元素设计成300px宽,150px高,具有圆角边…