问题描述:在长度为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. [Android]热修复框架AndFix测试说明

    AndFix,全称是Android hot-fix.是阿里开源的一个热补丁框架,允许APP在不重新发布版本的情况下修复线上的bug.支持Android 2.3 到 6.0,并且支持arm 与 X86系 ...

  2. [POI2012] BEZ-Minimalist Security

    一张n个点m条边的无向图,有点权有边权都是非负,且每条边的权值小于等于两个顶点的权值和,现在要将每个点减一个非负整数使得每条边权等于两个顶点的点权和,问最大修改代价和最小修改代价 思路神的一匹,完全想 ...

  3. jvm-内存区域与内存溢出异常

    内存区域与内存溢出异常 参考: http://www.cnblogs.com/ityouknow/p/5610232.html 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢? ...

  4. on绑定阻止冒泡失败

    使用zepto库,有如下dom <div id="J_parent"> <a href="#"> <span>点我有惊喜&l ...

  5. redhat6.4 数据包无法到达

    由于redhat在初始化的时候,防火墙设置为icmp-host-prohibited,导致数据包无法到达. 具体iptables(所在目录/etc/sysconfig)如下: # Firewall c ...

  6. NumPy切片和索引

    NumPy - 切片和索引 ndarray对象的内容可以通过索引或切片来访问和修改,就像 Python 的内置容器对象一样. 如前所述,ndarray对象中的元素遵循基于零的索引. 有三种可用的索引方 ...

  7. JNI_Z_10_Java的数组

    在Java中数组分为两种: (1).基本类型数组 (2).对象类型(Object[])的数组 (数组中存放的是指向Java对象中的引用) 一个能通用于两种不同类型数组的函数: GetArrayLeng ...

  8. MySQL主从配置实现(同一台主机)

    ////////////////////MySQL主从(同一台主机)////////////////////// 1.安装配置MySQL参考之前步骤搭建MySQL服务为了做实验方便,我们在同一台机器上 ...

  9. IOS-推送通知

    一.推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可见的 推送通知是可见的(能用肉眼看到)   iOS中提供了2种推送通知 本地推送通 ...

  10. 在启动mysql的时候出现如下问题:“ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)”

    今天在启动Mysql 的时候出现如下的问题:“ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)” 在查询 ...