在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题。

针对top K类问题,通常比较好的方案是分治+Trie树/hash+小顶堆(就是上面提到的最小堆),即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树或者Hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有top K中求出最终的top K。

方法进阶:

1、最简单的方法就是快排,取topk

2、局部淘汰法。用一个容器保存前k个数,然后将剩余的所有数字——与容器内的最小数字相比,如果所有后续的元素都比容器内的k个数还小,那么容器内这k个数就是最大k个数。如果某一后续元素比容器内最小数字大,则删掉容器内最小元素,并将该元素插入容器,最后遍历完所有的数,得到的结果容器中保存的数即为最终结果了

3、分治法。将1亿个数据分成100份,每份100万个数据,找到每份数据中最大的10000个,最后在剩下的100*10000个数据里面找出最大的10000个。100万个数据里面查找最大的10000个数据的方法如下:用快速排序的方法,将数据分为2堆,如果大的那堆个数N大于10000个,继续对大堆快速排序一次分成2堆,如果大的那堆个数N大于10000个,继续对大堆快速排序一次分成2堆,如果大堆个数N小于10000个,就在小的那堆里面快速排序一次,找第10000-n大的数字;递归以上过程,就可以找到第1w大的数。参考上面的找出第1w大数字,就可以类似的方法找到前10000大数字了。此种方法需要每次的内存空间为10^6*4=4MB,一共需要101次这样的比较。

4、采用最小堆。首先读入前10000个数来创建大小为10000的最小堆,建堆的时间复杂度为O(mlogm)(m为数组的大小即为10000),然后遍历后续的数字,并于堆顶(最小)数字进行比较。如果比最小的数小,则继续读取后续数字;如果比堆顶数字大,则替换堆顶元素并重新调整堆为最小堆。整个过程直至1亿个数全部遍历完为止。然后按照中序遍历的方式输出当前堆中的所有10000个数字。该算法的时间复杂度为O(nmlogm),空间复杂度是10000(常数)。

以下是一些经常被提及的该类问题。

(1)有10000000个记录,这些查询串的重复度比较高,如果除去重复后,不超过3000000个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请统计最热门的10个查询串,要求使用的内存不能超过1GB。
(2)有10个文件,每个文件1GB,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。按照query的频度排序。
(3)有一个1GB大小的文件,里面的每一行是一个词,词的大小不超过16个字节,内存限制大小是1MB。返回频数最高的100个词。
(4)提取某日访问网站次数最多的那个IP。
(5)10亿个整数找出重复次数最多的100个整数。
(6)搜索的输入信息是一个字符串,统计300万条输入信息中最热门的前10条,每次输入的一个字符串为不超过255B,内存使用只有1GB。
(7)有1000万个身份证号以及他们对应的数据,身份证号可能重复,找出出现次数最多的身份证号。

最小堆

对于每个非叶子节点的数值,一定不大于孩子节点的数值。这样可用含有K个节点的最小堆来保存K个目前的最大值(当然根节点是其中的最小数值)。每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。

Python 小顶堆:

class solution:def topk(self, inputs, k):import heapqif inputs == None or len(inputs) < k or len(inputs) <= 0 or k <= 0:# 注意极限条件的确定return []output = []for number in inputs:if len(output) < k:output.append(number)else:output = heapq.nlargest(k, output)print(output)if number >= output[-1]:output[-1] = numberelse:continuereturn output  

找出一个字符串中出现次数最多的字_海量数据中找出前k大数(topk问题)相关推荐

  1. c语言找出一个数组中出现次数最多的那个元素,c语言找出数组中出现次数最多地那个元素...

    matlab中如何找出不同维度矩阵出现次数最多的数组并记录其个数 首先是胞矩阵中的序列问题,不妨假设AA{1}是一个多行两列的数据,AA{2}同例.程序如下clcclearallAA{1}=[12;2 ...

  2. 找出一个字符串中出现次数最多的字_487,重构字符串

    想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答. 问题描述 给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同. 若可行 ...

  3. 找出一个字符串中出现次数最多的字_Day34:第一个只出现一次的字符

    剑指Offer_编程题--第一个只出现一次的字符 题目描述: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置,如果没有则返回-1 ...

  4. 【算法】大搜车——找出一个字符串中出现次数最多的字符,如果有多个出现次数相同的字符,那就找出最先出现的那个字符

    题目描述:找出一个字符串中出现次数最多的字符,如果有多个出现次数相同的字符,那就找出最先出现的那个字符 思考: 我的第一反应是分三步: 遍历字符串,统计每个字符出现的次数 找出最大的次数 找出最大次数 ...

  5. python counter 出现次数最少的元素_[PY3]——找出一个序列中出现次数最多的元素/collections.Counter 类的用法...

    问题 怎样找出一个序列中出现次数最多的元素呢? 解决方案 collections.Counter 类就是专门为这类问题而设计的, 它甚至有一个有用的 most_common() 方法直接给了你答案 c ...

  6. 找出一个数组中出现次数最多的那个元素

    Description 找出一个数组中出现次数最多的那个元素 Input 多组输入,请处理到文件结束 每组第一行输入一个整数n(不大于20) 第二行输入n个整数 Output 找出n个整数中出现次数最 ...

  7. 找一个字符串中出现次数最多的字符

    第一种: str = 'asdasddsfdsfadsfdghdadsdfdgdasd'str = str.split('');console.log(str);var newStr = {};// ...

  8. 辉太郎看前端(查找出字符串或数组中出现次数最多的字符)

    前言 利用字符串中的方法charAt(),返回指定下标位置的字符 字符串 // 1.统计次数var str = 'XMLHttpRequest';// 创建了一个空的对象,存储字符串中的每个字符.属性 ...

  9. java数组出现次数最多的数_找出数组中出现次数最多的那个数——主元素问题...

    方法一:以空间换时间,可以定义一个计数数组int count[101],用来对数组中数字出现的次数进行计数(只能针对数组中数字的范围1~100),count数组中最大的元素对应的下标,即为出现次数最多 ...

最新文章

  1. 企业级LNMP架构搭建实例(基于Centos6.x)
  2. Vue.js@2.6.10更新内置错误处机制,Fundebug同步支持相应错误监控
  3. python服务端多进程压测工具
  4. 房地产仍是经济支柱行业 80%中小房企面临合并
  5. Symbian 5800 重力开发的一些数据
  6. matlab中inv a,设A为矩阵,b为列向量,则Matlab中运算A\b 和运算inv(A)*b
  7. JProfiler12 最新使用教程
  8. 创客匠人工具助力教培机构快速适应线上教学
  9. bpsk调制及解调实验_【详解】5G的调制与解调
  10. 数字信号处理第二次试验:时域采样与频域采样
  11. Spark SQL简介
  12. 机动车号牌查询, 在线查询, api 查询
  13. 一只喵的西行记-4 蛋蛋的忧桑
  14. 基于single-spa+vue的前端微服务项目实践
  15. (私人收藏)2019WER积木教育机器人赛(普及赛)解决方案-(全套)采集深度学习样本
  16. 腾达ac1200远端服务器无响应,连3个磊科MG1200ac必死机
  17. numpy生成随机整数
  18. 惠头条自媒体如何产生爆文
  19. C/C++ 数组的初始化
  20. EOJ3054-波兰式求值(递归法)

热门文章

  1. Elasticsearch7.15.2 报java.lang.NoClassDefFoundError: org/elasticsearch/client/Cancellable的解决方案
  2. 定时任务的并发_03
  3. 解决vsftpd 读取目录列表失败的问题
  4. flowable 动态多实例
  5. Guns 切换Oracle分支
  6. .net core razor ajax,.NET CORE Razor Pages Ajax 调用 C# 方法
  7. java有string这个类型吗_关于java的String类型
  8. 造大专计算机学历,广昌县职业技术学校计算机应用专业助您 掌握一技之长获大专学历...
  9. html计时器组件,vue 计时器组件的实现代码
  10. python3.0实例_python3.0 模拟用户登录,三次错误锁定的实例