TopK问题的必会解法

这篇具有很好参考价值的文章主要介绍了TopK问题的必会解法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

经典解法,创建K个大小的堆

传统的直接建立一个K个元素的小顶堆,类似堆排序的思想, 然后将剩下的n-k个元素依次和堆顶元素比较,如果大于堆顶,就替换掉堆顶,然后向下调整到合适的位置,以此类推,最后这个堆中剩下的K个元素就是topK元素; 时间O (n logk) 空间O(k) ;相对来说是比较优的;

不考虑空间的暴力排序做法

  1. 归并等排序…时间O(NlogN) O(N)

  2. 时间上更优O(N): 类似于计数排序的映射思想,直接创建一个存的下所有int数字的数组,全按照原数据下标的index位置映射存进一个数组,出现一次数组的内容cnt++一次,之后从数组的末尾开始,从后往前遍历(topK)出来k个数字即可; 时间O(n)空间O(n); 是更快了一点哈; 但是这样有点太暴力了…

不考虑空间的快排partition变形减治法思想(核心:找第K大的数)

这里的减治法与分治法的区别(抽象举例):

处理元素以这个序列为例:111 2 333

  • 分治法: 假设以2为基准,我们把序列分为了111 和 333两部分,进而对这两部分继续按照一定的规则分治处理;

  • 减治法:假设以2为基准,我们找的是第3大的数,那么111直接被丢弃,我们只需要对333进一步减治处理即可与分治法比较,省去了对排除部分进行分支处理的开销!

思路:

  1. 找到K大的数字(借助快排的partion思想返回的pos区分左右两个侧大小的下标和二分的减治思想!注意:有重复也不影响哦; 前k大的数字 可以有多个一样的呀!)

  2. 然后再利用这个数字进行一次快排的partition,通过返回的下标,区分左右两侧,就能确定topK的数字了;

注意下图是找到第K小的数字(第k大还是小,取决于我们partition左侧方的是>=基准值得数还是<=基准值的数)

TopK问题的必会解法

找到第K大的数字以后; 进行一次partion,>=他的放在右边,那么右边就是前K大的了;

(同理,前k小,就找第k小,一次partion左边都是<= 的前k小了)

我们只在一段序列中partion出对应第k大的数字位置的下标即可,其他淘汰的字段不用再partion了,这种方法就避免了对除了Top K个元素以外的数据进行排序所带来的不必要的开销。

空间有限放不下,海量数据的分治法

将全部数据等分成N份,(N份前提是每份的数据都可以读到内存中进行处理),找到每份数据中最大的K个数;

再把这一共:N*K个(N份*每份的K个)的数据放入内存处理,可以用快排变形或者归并排序等;

(注意:如果N*K个如果又放不下,那么以此类推,继续分治,拿N*K个数据等分成每份M份(M份前提是放的进内存的粒度),再找topK,再把M*K个合起来放入内存用快排变形或者排序处理,以此类推;文章来源地址https://www.toymoban.com/news/detail-436147.html

到了这里,关于TopK问题的必会解法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2022全国大学生数学建模A题的思路与解法

    首先,我们队在历经了千辛万苦之后,光荣得获得了  省三...... 队伍构成 物理*2 + 计算机*1 队伍分工  计算机--受力分析  物理--数值计算 总评:图一乐,狠乐!物理系,计算机系嘛,不怎么看建模的啦! 如果只是考虑力学问题的话,我们分析得肯定还不太到位,但是这个题

    2024年02月06日
    浏览(50)
  • 20个经典面试问题Python面向对象实战--飞机大战(1),Python中高级面试必知必会

    each.reset() for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image1, each.rect) pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain 0.2: en

    2024年04月15日
    浏览(43)
  • 【数据结构】单链表经典算法题的巧妙解题思路

    目录 题目 1.移除链表元素 2.反转链表 3.链表的中间节点 4.合并两个有序链表 5.环形链表的约瑟夫问题 解析 题目1:创建新链表 题目2:巧用三个指针 题目3:快慢指针 题目4:哨兵位节点 题目5:环形链表   介绍完了单链表,我们这次来说几个经典的题目,本篇的题目衔接下一

    2024年04月28日
    浏览(54)
  • element-ui部分表单组件的必填校验问题

    el-date-picker 必填校验 el-cascader 必填校验

    2024年02月12日
    浏览(47)
  • Java LeetCode篇-深入了解关于数组的经典解法

    🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍       文章目录         1.0 轮转数组         1.1 使用移位的方式         1.2 使用三次数组逆转法         2.0 消失的数字         2.1 使用相减法         2.2 使用异或的方式         3.

    2024年02月05日
    浏览(68)
  • Java LeetCode篇-深入了解关于单链表的经典解法

       🔥博客主页: 【 小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍   文章目录         1.0 移除链表元素         1.1 使用双指针方法         2.0 反转链表         2.1 递归法         2.2 头插法         3.0 链表中倒数第 k 个节点         3.1 递归法  

    2024年02月05日
    浏览(80)
  • 二叉树经典14题——初学二叉树必会的简单题

      此篇皆为leetcode、牛客中的简单题型和二叉树基础操作,无需做过多讲解,仅付最优解。有需要的小伙伴直接私信我~ 目录 1.二叉树的节点个数 2.二叉树叶子节点个数 3.二叉树第K层节点个数 4.查找值为X的节点 5.leetcode——二叉树的最大深度 6.leetcode——单值二叉树 7.leetcode—

    2024年02月01日
    浏览(40)
  • 【TopK问题】——用堆实现

    TopK问题就是从1000个数中找出前K个最大的数或者最小的数这样的类似问题。 不过并不要求这k个数字必须是有序的,如果题目有要求,则进行堆排序即可。 还有比如求出全国玩韩信前十名等等,排出班级前十名也是TopK问题。 采用堆的方式可以较快解决。 思路:如果需要排前

    2023年04月16日
    浏览(25)
  • 【数据结构】---TopK问题

    本文提供用建堆来解决TopK问题的一个思路 N个数中找出最大的或者最小的前k个 假设现从N个数中找最小的前k个 ①堆排序, 时间复杂度O(N*logN),这N个数排一下序,前k个数就是需要的 ②建堆N个数的小堆 ,HeapPop k-1 次,就选出来了,因为小堆最小的在堆顶,选出一次后,再删除

    2024年02月12日
    浏览(46)
  • 【数据结构】——解决topk问题

    前言:我们前面已经学习了小堆并且也实现了小堆,那么我们如果要从多个数据里选出最大的几个数据该怎么办呢,这节课我们就来解决这个问题。我们就用建小堆的方法来解决。 首先我们来看到这个方法的时间复杂度,我们先取前k个数据建立一个小堆,后面插入的数据依

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包