现有如下题目:有一个海量文本,存储的是汉语词语,要求从中找出前K个出现频率最高的词语,写出最优算法,兼顾时间和空间复杂度。

思路分析:熟悉搜索引擎的程序员,应该不是难题。用传统的HashMap是无法解决的,因为数据量非常庞大的时候,空间复杂度会导致程序运行时,频繁执行MinorGC和MajorGC,最终JVM会宕掉。之前写的字母排列算法的时候,当输出100多万条数据的时候,JVM就宕掉了,下面用自平衡的三叉树来解决此问题。

第一步:对文本进行排序和折中处理,更新文本,要要用到pinyin4j项目包;

第二步:把更新后的字典,加载到三叉树中,实现平衡的三叉树,自定义的三叉树要增加节点字符出现次数的变量,以便实现词频统计;

第三步:遍历字典,每次读到的词语,用三叉树查询,得到频率,然后把读到的词语和频率写到另一个文件中,用空格分开,类似于Key-value键值对形式;

第四步:和上一篇的问题雷同,从海量数据中查找出前10个最小值;

第五步:得到最小频率值的堆后,从新的文本中找到对应的词语,加入到set中,统一频率的词语会有很多,而不是一个,输出应该是如下形式:

[xxx,xxx,xxx……]

[xxx,xxx,xxx……]

[xxx,xxx,xxx……]

……

代码省略,不上传了!

从海量文本中统计出前k个频率最高的词语的更多相关文章

  1. 输出《Harry Potter and the Sorcerer's Stone》文本中的前N个最长用的英文单词及其数量

    输出<Harry Potter and the Sorcerer's Stone>文本中的前N个最长用的英文单词及其数量 实验思路: 1. 利用输入流将文件当中内容读入. 2. 将文件内容 ...

  2. 寻找无序数组中的前k大元素

    题目描述 以尽可能小的代价返回某无序系列中的两个最大值,当有重复的时设置某种机制进行选择. 题解 首先要考虑的是重复的数的问题. A.不处理重复数据方法:在处理第k大的元素时不处理重复的数据,也就是将 ...

  3. 原创:从海量数据中查找出前k个最小或最大值的算法(java)

    现在有这么一道题目:要求从多个的数据中查找出前K个最小或最大值 分析:有多种方案可以实现.一.最容易想到的是先对数据快速排序,然后输出前k个数字.   二.先定义容量为k的数组,从源数据中取出前k个填 ...

  4. (算法)前K大的和

    题目: 1.有两个数组A和B,每个数组有k个数,从两个数组中各取一个数加起来可以组成k*k个和,求这些和中的前k大. 2.有N个数组,每个数组有k个数,从N个数组中各取一个数加起来可以组成k^N个和, ...

  5. HDU 6041 I Curse Myself(点双联通加集合合并求前K大) 2017多校第一场

    题意: 给出一个仙人掌图,然后求他的前K小生成树. 思路: 先给出官方题解 由于图是一个仙人掌,所以显然对于图上的每一个环都需要从环上取出一条边删掉.所以问题就变为有 M 个集合,每个集合里面都有一堆 ...

  6. 算法导论学习之线性时间求第k小元素+堆思想求前k大元素

    对于曾经,假设要我求第k小元素.或者是求前k大元素,我可能会将元素先排序,然后就直接求出来了,可是如今有了更好的思路. 一.线性时间内求第k小元素 这个算法又是一个基于分治思想的算法. 其详细的分治思 ...

  7. [LeetCode]347. 前 K 个高频元素(堆)

    题目 给定一个非空的整数数组,返回其中出现频率前 k 高的元素. 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1 ...

  8. Leetcode(215)-数组中的第K个最大元素

    在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 ...

  9. 海量数据中找出前k大数(topk问题)

    海量数据中找出前k大数(topk问题) 前两天面试3面学长问我的这个问题(想说TEG的3个面试学长都是好和蔼,希望能完成最后一面,各方面原因造成我无比想去鹅场的心已经按捺不住了),这个问题还是建立最小 ...

随机推荐

  1. 【洛谷 P5017】 摆渡车(斜率优化)

    题目链接 算是巩固了一下斜率优化吧. 设\(f[i]\)表示前\(i\)分钟最少等待时间. 则有\(f[i]=\min_{j=0}^{i-m}f[j]+(cnt[i]-cnt[j])*i-(sum[i ...

  2. vue watch 的简单使用

    在项目开发中遇到的需求,这点写第一个dome 监听父组件传过来的值发送变化 在子组件中 <template> <div class="components"> ...

  3. TR-银行通信相关文档

    DMEE配置指南: https://wenku.baidu.com/view/06790649767f5acfa1c7cd73.html F110 DMEE配置: https://wenku.baid ...

  4. Redis一主二从Sentinel监控配置

    本文基于Redis单实例安装安装.https://gper.club/articles/7e7e7f7ff7g5egc4g6b 开启哨兵模式,至少需要3个Sentinel实例(奇数个,否则无法选举Le ...

  5. Linux常用时间函数

    time()函数: NAME time - get time in seconds SYNOPSIS #include <time.h> time_t time(time_t *tloc) ...

  6. China International Industry Fair 2019

    Today i visit the CIIF 2019, as a "professional visitor"  since i have made an appointment ...

  7. maven报错找不到依赖

    遇到一个巨坑 跑公司的一个项目,拉下来代码,跑不起来.发现maven一直报这个错 was cached in the local repository,resolution will not be r ...

  8. linux系统编程之管道(二)

    今天继续研究管道,话不多说,言归正传: 对于管道,有一定的读写规则,所以这里主要是对它的规则进行探讨,具体规则如下: 规则一: 下面用程序来验证下,还是用上节学的子进程写数据,父进程读取数据的例子,只 ...

  9. 《发际线总是和我作对》第九次团队作业:【Beta】Scrum meeting1

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十三 团队作业9:Beta冲刺与团队项目冲刺 团队名称 发际线总和我作队 作业学习目标 (1)掌握软件黑盒测试技术:(2)掌握软件 ...

  10. BZOJ1396 识别子串 和 BZOJ2865 字符串识别

    字符串识别 2865: 字符串识别 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 839  Solved: 261[Submit][Status][D ...