海量文本信息查Top-k

问题描述:

  有1千万条短信,一条一行,有重复。在5分钟之内,找出重复出现的前10条。

方案一:

  1.分组进行边扫描边建散列表。建立哈希表,使用头,尾和中间随便两个字节作为Hash Code, 插入到Hash table中,并记录其地址和重复次数。

  2.hash code同且等长-》判定为疑似相同。然后hash table统计重复次数。

  3.用线性时间选择在O(n)级别上完成前10条的寻找。

方案二:

  1.按照长度短-》长进行处理。

  2.按照长度进行分组,每组通过头尾中间粗略判断相等,找出每组的top10。

  3.从各次top10结果中找到备选的top10,然后再精确搜索找到真正的top10。

方案三:

  1.采用内存映射,加载文本。

  2.建立字典树,统计top10个字符串。

时间: 2024-10-11 08:23:15

海量文本信息查Top-k的相关文章

从海量文本中统计出前k个频率最高的词语

现有如下题目:有一个海量文本,存储的是汉语词语,要求从中找出前K个出现频率最高的词语,写出最优算法,兼顾时间和空间复杂度. 思路分析:熟悉搜索引擎的程序员,应该不是难题.用传统的HashMap是无法解决的,因为数据量非常庞大的时候,空间复杂度会导致程序运行时,频繁执行MinorGC和MajorGC,最终JVM会宕掉.之前写的字母排列算法的时候,当输出100多万条数据的时候,JVM就宕掉了,下面用自平衡的三叉树来解决此问题. 第一步:对文本进行排序和折中处理,更新文本,要要用到pinyin4j项目

海量数据处理算法(top K问题)

举例 有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M.返回频数最高的100个词. 思路 首先把文件分开 针对每个文件hash遍历,统计每个词语的频率 使用堆进行遍历 把堆归并起来 具体的方案 1.分治: 顺序读文件中,对于每个词c,取hash(c)%2000,然后按照该值存到2000个小文件中.这样每个文件大概是500k左右. 注意: 如果其中的有的文件超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小都不超过1M. 2.hash

Top k 问题

Top K的问题: 给出大量数据,找出其中前K个最大(小)的数,或者在海量数据中找到出现频率最好的前K个数. 一.给出大量数据(N个),找出其中前K个最大数(没有其他资源上的限制) 1.使用排序算法 直接使用排序算法,如快速排序,然后遍历找到最大的K个数.时间复杂度为O(NlogN): 2.部分排序 因为,只要求出前K个最大值,所以我们不必全部排好.思路是:随意选出K个数形成一个数组,然后按从大到小进行排序,再从剩下的数中,选取一个数和数组中的最小值进行比较,若小于最小值,则取下一个数继续比较:

bzoj 1269 Splay处理文本信息

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1269 大致思路: 用splay维护整个文本信息,splay树的中序遍历即为该文本. 收获: 1.可以先在文本开始和结尾个插入一个节点,然后每次操作都适当调整位置,这样可以减少特判(插入一段文本到0位置,在最后插入一段文本...) 2.查找一段文本[lf,rg],可以先找到位置为lf-1的节点(因为1,不用特判没有了),splay到根,再找到rg+1的节点,旋转到根的下面,这样根右子节点的左子

Top K Selector

转自http://cache.baiducontent.com/ 之前Tango的笔试题中最后一道Top K的算法题,题中明确要求了需要尽可能的在运行时间上进行优化,当时解题时并没有很好的思路,采用了排序后再获得头K个数据的解法,但明显感觉这种解法不是最优的,因此决定对这个问题做更进一步的探索. Top K问题应该是当前互联网中非常普遍的应用场景了,如搜索引擎的热门关键字排序,电商网站的热销商品排序等.由于互联网数据非常庞大,因此通常来说结果集的规模远小于原始数据集的规模. Top K问题最直接

pig询问top k,每个返回hour和ad_network_id最大的两个记录(SUBSTRING,order,COUNT_STAR,limit)

pig里面有一个TOP功能.我不知道为什么用不了.有时间去看看pig源代码. SET job.name 'top_k'; SET job.priority HIGH; --REGISTER piggybank.jar; REGISTER wizad-etl-udf-0.1.jar; --DEFINE SequenceFileLoader org.apache.pig.piggybank.storage.SequenceFileLoader(); DEFINE SequenceFileLoader

关于js复制文本信息(按钮级别)

最近应产品要求,需要实现一个按钮级别热复制文本功能,效果就是单击按钮复制对应的文本,该文本是需要从数据库里面取出来然后加密的,最初的打算是使用js插件在前台页面搞定.    于是上网找了一些相关资料,发现几乎都是用的zeroClipBoard这个插件,这个插件使用的是flash来实现复制效果,但是flash在目前已 经不再流行,甚至有些浏览器已经不再对flash支持或者完全禁用,于是便暂时放弃了这个想法.但是在查找途中发现ie竟然可以一句代码搞定复制,顿时觉 得好无语(尤其是对比ie和其他浏览器

Top K问题的两种解决思路

Top K问题在数据分析中非常普遍的一个问题(在面试中也经常被问到),比如: 从20亿个数字的文本中,找出最大的前100个. 解决Top K问题有两种思路, 最直观:小顶堆(大顶堆 -> 最小100个数): 较高效:Quick Select算法. LeetCode上有一个问题215. Kth Largest Element in an Array,类似于Top K问题. 1. 堆 小顶堆(min-heap)有个重要的性质--每个结点的值均不大于其左右孩子结点的值,则堆顶元素即为整个堆的最小值.J

面试题-10亿个数中找出最大的10000个数(top K问题)

一个较好的方法:先拿出10000个建立小根堆,对于剩下的元素,如果大于堆顶元素的值,删除堆顶元素,再进行插入操作,否则直接跳过,这样知道所有元素遍历完,堆中的10000个就是最大的10000个.时间复杂度: m + (n-1)logm = O(nlogm) 优化的方法:可以把所有10亿个数据分组存放,比如分别放在1000个文件中(如果是字符串hash(x)%M).对每个文件,建立大小为10000的小根堆,然后按有序数组的合并合并起来,取出最大的10000个即是答案. top K问题 在大规模数据