问题描述:在长度为n的序列中,找出其最大的K个数

1.冒泡排序

每冒泡一次,可将最大的数放到序列尾部,冒泡K次即可。

时间复杂度:O(K*n)

空间复杂度:O(1)

2.扫描数组,将最大的N个数存在缓存中,当有更大的数到来时替换缓存中的数

TOP_K(A,K)
n = length of A
create array T[K] = {-∞}
t = for i = , n-
do
if T[K-] < A[i] then
INSERT A[i] TO SORTED ARRAY T[]

时间复杂度:O(n*K)

空间复杂度:O(K)

可以考虑用最小堆代替缓存数组存储最大的K个数,这样当A[i] 大于堆顶元素时,使用A[i]代替堆顶元素,然后调整堆,复杂度为 O(n*lgK)

3.堆排序,优先级队列

构造一个堆,从堆顶取出N个元素

时间复杂度: O(n+K*lgn)

空间复杂度: O(1)

4.用选择法找出第K个元素,然后对前K个元素进行排序

 FIND_K( A ,K)
n = length of A
i = random index of n
swap A[i] A[n-] a =
b = n-
while true
while A[a] <= A[n-]
a++
while A[b] >= A[n-]
b++
if a>= b then break
swap A[a] A[b]
swap A[b] A[n-] if b == K then return b
else if b > K then return FIND_K(A[:b],K)
else return FIND_K(A[b:n],K-b) TOP_K(A,K)
p = FIND_K(A,K)
sort(A,,p)

FIND_K的时间复杂度为O(n),则TOP_K的时间复杂度为 O(n + K*lgK)

TOP K问题的若干实现的更多相关文章

  1. 海量数据中找top K专题

    1. 10亿个数中找出最大的1000个数 这种题目就是分治+堆排序. 为啥分治?因为数太多了,全部加载进内存不够用,所以分配到多台机器中,或者多个文件中,但具体分成多少份,视情况而定,只要保证满足内存 ...

  2. top(k,n)—db kernel队解题思路

    0. 比赛 公司里的第三届XX中间件性能挑战赛 我和另外两个P5组队参加,队名为"db kernel".最后获得了第八,应该是P5里的最高排名. 以下简单扼要地介绍一下题目,以及我 ...

  3. [LeetCode] Top K Frequent Elements 前K个高频元素

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  4. Leetcode 347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  5. 大数据热点问题TOP K

    1单节点上的topK (1)批量数据 数据结构:HashMap, PriorityQueue 步骤:(1)数据预处理:遍历整个数据集,hash表记录词频 (2)构建最小堆:最小堆只存k个数据. 时间复 ...

  6. LeetCode "Top K Frequent Elements"

    A typical solution is heap based - "top K". Complexity is O(nlgk). typedef pair<int, un ...

  7. [IR] Ranking - top k

    PageRanking 通过: Input degree of link "Flow" model - 流量判断喜好度 传统的方式又是什么呢? Every term在某个doc中的 ...

  8. 347. Top K Frequent Elements

    Given a non-empty array of integers, return the k most frequent elements. For example,Given [1,1,1,2 ...

  9. 面试题:m个长度为n的ordered array,求top k 个 数字

    package com.sinaWeibo.interview; import java.util.Comparator; import java.util.Iterator; import java ...

随机推荐

  1. linux下字典生成工具-crunch与rtgen

    所谓的密码字典主要是配合密码破解软件所使用,密码字典里包括许多人们习惯性设置的密码.这样可以提高密码破解软件的密码破解成功率和命中率,缩短密码破解的时间.当然,如果一个人密码设置没有规律或很复杂,未包 ...

  2. HDU 1263 二维map

    题意:给出一份水果的交易表,根据地区统计出水果的交易情况.   思路:二维map使用.   #include<cstdio> #include<string> #include ...

  3. PHP练习题二

    1.抓取远程图片到本地,你会用什么函数? fsockopen, A 2.用最少的代码写一个求3值最大值的函数. function($a,$b,$c){* W0 z* u6 k+ e. L  a: }5 ...

  4. JSR规范整理

    Web Service技术 Java Date与Time API ( JSR 310) Java API for RESTful Web Services (JAX-RS) 1.1 (JSR 311) ...

  5. no matching key exchange method found. Their offer: diffie-hellman-group1-sha1

    1. 使用git克隆项目报错 $ git clone ssh://liuchao@192.168.7.32:29418/platform/Midou Cloning into 'Midou'... U ...

  6. Autofac property injection

    https://autofaccn.readthedocs.io/en/latest/register/prop-method-injection.html Property and Method I ...

  7. SQL Server2012在软件开发中的一些新特性

    官方给出了一大堆SQL2012相对于SQL2008R2的新特性,但是大多数对于普通开发人员来说都是浮云,根本用不到,下面就说说一些对于开发人员来说比较有用的新特性.   一.在SQL Server中终 ...

  8. eclipse——JavaEE插件

    步骤如下 1.先看自己的eclipse版本 2.开始安装JavaEE插件 http://download.eclipse.org/releases/Photon 注意:这里后面红色的是博主eclips ...

  9. java关键词整理——思维导图

    如图 思维导图图片链接 http://www.edrawsoft.cn/viewer/public/s/5e27f174483042

  10. C++ 函数后面的const

    一个函数 AcGePoint3dstartPoint() const; const放在后面跟前面有区别么 ==> 准确的说const是修饰this指向的对象的 譬如,我们定义了 classA{ ...