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

在海量数据中找出出现频率最好的前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个目前的最大值(当然根节点是其中的最小数值)。每次有数据输入的时候可以先与根节点比较。若不大于根节点,则舍弃;否则用新数值替换根节点数值。并进行最小堆的调整。

de75e39a35893d372d84a046843e6ecb.png

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  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532102.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

crowd counting_[crowd_counting]-SFCN-CVPR2019amp;amp;GCC dataset

1.Contribution&#xff08;1&#xff09;主要是提出了基于GTA5的GCC数据集数据集下载地址&#xff1a;https://gjy3035.github.io/GCC-CL/​gjy3035.github.io&#xff08;2&#xff09;提出了在如何在GCC上train&#xff0c;然后在传统的通用数据集上test的迁移学习方案&…

代码更换ui图片_用技术的方式,在UI设计稿中设置随机码,保证高清

本文首发于&#xff1a;行者AI 在工作中会遇到批量给图片添加文字&#xff0c;随机码等需求&#xff0c;当数据码数量较大时&#xff0c;UI的工作量就会非常大&#xff0c;这时候我们可以用python来帮我们提高工作效率。1. 需求分析我们有这样一张图片&#xff0c;我们需要将一…

hash地址_redis中的hash扩容、渐进式rehash过程

背景&#xff1a; redis字典&#xff08;hash表&#xff09;当数据越来越多的时候&#xff0c;就会发生扩容&#xff0c;也就是rehash对比&#xff1a;java中的hashmap&#xff0c;当数据数量达到阈值的时候(0.75)&#xff0c;就会发生rehash&#xff0c;hash表长度变为原来的二…

是什么牌子_水晶项链什么牌子好

阅读本文前&#xff0c;请您先点击上面的蓝色字体&#xff0c;再点击“关注”&#xff0c;这样您就可以免费收到最新内容了。每天都有分享&#xff0c;完全是免费订阅&#xff0c;请放心关注&#xff01; …

iframe异步加载_5种延迟加载图像的方法以帮助你提升网站性能与用户体验

英文 | https://www.sitepoint.com/five-techniques-lazy-load-images-website-performance/翻译 | web前端开发(ID&#xff1a;web_qdkf)由于图像是Web上最流行也是必不可少的内容类型之一&#xff0c;因此网站上的图片页面加载时间很容易成为一个问题。即使进行了适当的优化&…

springframework报错_应对报错信息的必杀技!

今天遇到了一个错误&#xff0c;一般的错误提示会很明显&#xff0c;一看就知道是什么问题。今天遇到的这个说实话真的不好找原因&#xff0c;一般在这种情况下该怎么解决呢&#xff1f;分享下我的思路吧&#xff0c;不一定是最好的&#xff0c;至少有用。直接上图吧&#xff0…

电脑运行卡顿怎么处理_【众点学】电脑运行PS卡顿?可能是你的虚拟内存没设置好!...

不少小伙伴都遇到过这样的烦恼明明自己的电脑拥有大内存PS用着用着就卡顿了经过教体君的仔(bai)细(du)研(yi)究(xia)发现原来电脑的 虚拟内存 只有2G当我们用大型软件或玩大型游戏电脑越用越卡时该怎么做&#xff1f;今天【众点学】我们一起来看看Win7和Win10系统下分别如何设置…

线程池拒绝策略 开发中常用什么策略_面试官:说说你知道多少种线程池拒绝策略...

往期文章为什么阿里Java规约要求谨慎使用SimpleDateFormathttps://www.toutiao.com/i6696127929048367629/为什么我强烈推荐你用枚举来实现单例模式https://www.toutiao.com/i6696861933687013901/为什么不要在MySQL中使用UTF-8编码方式https://www.toutiao.com/i6697966437727…

css html 双面打印_从 Linux 命令行进行打印 | Linux 中国

导读&#xff1a;在 Linux 命令行进行打印的内容比单单一个 lp 命令多得多&#xff0c;让我们来看一些可用选项。       本文字数&#xff1a;4305&#xff0c;阅读时长大约&#xff1a;5分钟https://linux.cn/article-13012-1.html作者&#xff1a;Sandra Henry-stocker译…

服务器内存超限问题_服务器内存爆满最佳处置方案

内存爆满截图&#xff1a;分析&#xff1a;内存持续飙升&#xff0c;应该是有大量内存一直没有释放&#xff0c;考虑僵尸对象&#xff0c;僵尸进程&#xff0c;最简单的就是重启服务器&#xff0c;但是就无法找到罪魁祸首了。验证&#xff1a;top命令查看活跃进程的资源使用情况…

js map对象遍历_何时使用 Map 来代替变通的 JS 对象

JS 普通对象 {key: value} 用于存放结构化数据。但有一件事我觉得很烦:对象键必须是字符串(或很少使用的 symbol)。如果将数字用作键会怎样&#xff1f;在这种情况下不会有错误&#xff1a;const names { 1: One, 2: Two,};Object.keys(names); // > [1, 2]JS 会隐式地将…

mysql怎么显示结果窗口_mysql8中窗口函数

在以前的MySQL版本中是没有窗口函数的&#xff0c;直到MySQL8.0才引入了窗口函数。窗口函数是对查询中的每一条记录执行一个计算&#xff0c;并且这个计算结果是用与该条记录相关的多条记录得到的。1.窗口函数与聚合函数窗口函数与聚合函数很像&#xff0c;他们都是在一组记录而…

log4jdbc mysql_[简单]log4jdbc-log4j2配置简记_MySQL

log4jdbc-log4j2&#xff0c;就不多说了&#xff0c;不了解的可以谷歌&#xff0c;附上log4jdbc-log4j2的官方链接&#xff1a;https://code.google.com/p/log4jdbc-log4j2/ &#xff0c;上面有非常详细的介绍。简单的贴下配置文件&#xff0c;其他的见附件&#xff1a;databas…

vb实时错误6 溢出_java内存溢出系列(6): Out of swap space?

本文是java内存溢出系列第6小篇。JVM启动参数指定了最大内存限制。如 -Xmx 以及相关的其他启动参数. 假若JVM使用的内存总量超过可用的物理内存, 操作系统就会用到虚拟内存。错误信息 java.lang.OutOfMemoryError: Out of swap space? 表明, 交换空间(swap space,虚拟内存) 不…

java备份还原mysql数据库_Java备份还原Mysql数据库

///实体类package com.ews.util;/*** 系统备份展示对象** */public class DataFile {private String fileName;//备份文件的名称private String fileDate;//备份文件的日期private String filePath;//备份文件的地址private String fileSize;//备份文件的大小public String get…

mysql 查看锁_别吵吵,分布式锁也是锁

Tomcat是这个系统的核心组成部分&#xff0c; 每当有用户请求过来&#xff0c;Tomcat就会从线程池里找个线程来处理&#xff0c;有的执行登录&#xff0c;有的查看购物车&#xff0c;有的下订单&#xff0c;看着属下们尽心尽职地工作&#xff0c;完成人类的请求&#xff0c;Tom…

php解析js的 arraybuffer_JS的所谓的第七种数据类型Symbol

首先&#xff0c;为什么说叫所谓呢&#xff1f;因为在2007年之前Js给予我们typeof解析数据类型的一共有六种(一直有争议&#xff0c;但是我们暂时就按typeof来算)functionNumberObjectbooleanStringundefined但当我们去 typeof Symbol () 的时候&#xff0c;会惊奇的发现&#…

Ubuntu系统如何安装和卸载CUDA和CUDNN

背景 最近在学习PaddlePaddle在各个显卡驱动版本的安装和使用&#xff0c;所以同时也学习如何在Ubuntu安装和卸载CUDA和CUDNN&#xff0c;在学习过程中&#xff0c;顺便记录学习过程。在供大家学习的同时&#xff0c;也在加强自己的记忆。本文章以卸载CUDA 8.0 和 CUDNN 7.05 …

session.merge 缓存不更新_如何保证缓存与数据库双写时的数据一致性?

在做系统优化时&#xff0c;想到了将数据进行分级存储的思路。因为在系统中会存在一些数据&#xff0c;有些数据的实时性要求不高&#xff0c;比如一些配置信息。基本上配置了很久才会变一次。而有一些数据实时性要求非常高&#xff0c;比如订单和流水的数据。所以这里根据数据…

java替换图片中文字_Java 添加、替换、删除Word中的图片

文档中&#xff0c;可以通过图文混排的方式来增加内容的可读性&#xff0c;相比纯文本文档&#xff0c;在内容展现方式上也更具美观性。在给文档添加图片时&#xff0c;可设置图片的文本环绕方式、旋转角度、图片高度/宽度等&#xff1b;另外&#xff0c;也可对文档中已有的图片…