美文网首页
TOP K问题的解决

TOP K问题的解决

作者: chengcongyue | 来源:发表于2019-04-11 00:33 被阅读0次

典型例题

给定一个无序的数组,找到其中最小的k个数
想这种topK类型的题目,首先我们能想到的就是堆,在这里我们要找的是最小的k个数,那我们是建立大根堆还是小根堆那.
我们假设一下,如果建立的是小根堆该如何进行,小根堆中是最小的k个数,所有顶部位置就是k个数中最小的数,如果这个时候有一个值要进入,到底要不要加入那...所以建立小根堆是错误的,应该建立的是大根堆
我们通过大根堆来完成这个操作,其中大根堆就是最小的k个数,堆顶那就是这k个数中最大的那个数,所以随时有可能会被替换.替换之后然后在进行调整.
核心函数如下

public int[]  f(int[] arr,int k)
{
     int[] kHeap=new int[k];
     for(int i......)
     {
          由前k个元素构成了大根堆
     }
     for(从第k个开始遍历)
     {
          //如果小于堆顶的元素,进入,然后heapify
     }

}

这个就是比较容易立即的方式,此时时间复杂度为O(n*logN)

BFPRT算法

接下来,就是重头戏了,我们来介绍一下时间复杂度为O(n)的算法
在开始之前,我们先做一个小小的转化,我们将这个问题转化为寻找第k小的数,这样最后通过一个O(N)的循环就可以得到结果
1.首先,我们队将整个数组都划分成5个一小组,最后不满5个的话,也化为一组
2.然后我们找出每个小组中的中位数,将所有的中位数组成一个数组
3.通过递归的方式,寻找到这个中位数中的中位数
4,然后根据这个中位数进行parition过程,最后如果result的位置=k,说明result就是第k小的数 如果result>k,说明k在左边,否则在右边
这里先不列出代码,因为过于繁多,然后我们再来分析一下这样的时间复杂度...
帖子先写到这里

相关文章

  • JavaScript BFPRT 算法

    BFPRT 算法 背景 在一组数中求其前 k 小的数,简称TOP-K问题。而目前解决TOP-K问题最有效的算法即是...

  • Python一天一模块: heapq 堆列队方法

    heapq是一个内建模块, 实现了一个堆的数据结构,完美的解决了Top-K问题,以后解决Top-K问题的时候,直接...

  • TOP K问题的解决

    典型例题 给定一个无序的数组,找到其中最小的k个数想这种topK类型的题目,首先我们能想到的就是堆,在这里我们要找...

  • 2018-05-17

    学习DHT时候的问题 1.peers和nodeid的区别。 2.top k问题用堆解决,查询复杂度为O(k + (...

  • BFPRT详解(top-k问题)

    top-K问题指的是从一个数组中找出里面前k大或是前k小的问题。解决这类问题可以有以下的集中方法。 1、排序。排序...

  • top K问题

    问题:海量数据处理 - 10亿个数中找出最大的10000个数。解决方案:先拿10000个数建堆,然后一次添加剩余元...

  • Top K问题

    新文集等待补充

  • Top K 问题

    问题描述 有N(N>>10000)个整数,求出其中的前K个最大的数。 问题分析 需要前K个最大数,一定会有比较的过...

  • Top K 问题

  • Top K问题

    参考网站 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第...

网友评论

      本文标题:TOP K问题的解决

      本文链接:https://www.haomeiwen.com/subject/vaoaiqtx.html