因为用户搜索的关键词,有很多可能都是重复的,所以我们首先要统计每个搜索关键词出现的频率。我们可以通过散列表、平衡二叉查找树或者其他一些支持快速查找、插入的数据结构,来记录关键词及其出现的次数。

假设我们选用散列表。我们就顺序扫描这 10 亿个搜索关键词。当扫描到某个关键词时,我们去散列表中查询。如果存在,我们就将对应的次数加一;如果不存在,我们就将它插入到散列表,并记录次数为 1。以此类推,等遍历完这 10 亿个搜索关键词之后,散列表中就存储了不重复的搜索关键词以及出现的次数。

然后,我们再根据前面讲的用堆求 Top K 的方法,建立一个大小为 10 的小顶堆,遍历散列表,依次取出每个搜索关键词及对应出现的次数,然后与堆顶的搜索关键词对比。如果出现次数比堆顶搜索关键词的次数多,那就删除堆顶的关键词,将这个出现次数更多的关键词加入到堆中。

以此类推,当遍历完整个散列表中的搜索关键词之后,堆中的搜索关键词就是出现次数最多的 Top 10 搜索关键词了。

不知道你发现了没有,上面的解决思路其实存在漏洞。10 亿的关键词还是很多的。我们假设 10 亿条搜索关键词中不重复的有 1 亿条,如果每个搜索关键词的平均长度是 50 个字节,那存储 1 亿个关键词起码需要 5GB 的内存空间,而散列表因为要避免频繁冲突,不会选择太大的装载因子,所以消耗的内存空间就更多了。而我们的机器只有 1GB 的可用内存空间,所以我们无法一次性将所有的搜索关键词加入到内存中。这个时候该怎么办呢?

我们在哈希算法那一节讲过,相同数据经过哈希算法得到的哈希值是一样的。我们可以根据哈希算法的这个特点,将 10 亿条搜索关键词先通过哈希算法分片到 10 个文件中。

具体可以这样做:我们创建 10 个空文件 00,01,02,……,09。我们遍历这 10 亿个关键词,并且通过某个哈希算法对其求哈希值,然后哈希值同 10 取模,得到的结果就是这个搜索关键词应该被分到的文件编号。

对这 10 亿个关键词分片之后,每个文件都只有 1 亿的关键词,去除掉重复的,可能就只有 1000 万个,每个关键词平均 50 个字节,所以总的大小就是 500MB。1GB 的内存完全可以放得下。

我们针对每个包含 1 亿条搜索关键词的文件,利用散列表和堆,分别求出 Top 10,然后把这个 10 个 Top 10 放在一块,然后取这 100 个关键词中,出现次数最多的 10 个关键词,这就是这 10 亿数据中的 Top 10 最频繁的搜索关键词了。

如何快速获取到Top 10最热门的搜索关键词?相关推荐

  1. 29 | 堆的应用:如何快速获取到Top 10最热门的搜索关键词?

    为什么评价算法性能是根据时间和空间复杂度,而不是别的参数?是因为计算机结构是冯诺依曼体系,除了输入输出设备和控制器,就剩下运算器和存储器了 问题引入 搜索引擎的热门搜索排行榜功能是如何实现的?搜索引擎 ...

  2. python使用列表,快速获取1到10的平方

    python使用列表,快速获取1到10的平方 squares = [value**2 for value in range(1, 11)] print(squares) 这个蛮活的 1.要使用三次方或 ...

  3. PyQt5快速开发与实战 10.1 获取城市天气预报

    PyQt5快速开发与实战 文章目录 PyQt5快速开发与实战 10. 第10章 PyQt5 实战一:经典程序开发 10.1 获取城市天气预报 10.1.1 获取天气数据 10.1.2 获取不同城市的天 ...

  4. 香港买android手机,2015 Q3中国大陆/香港/台湾最热门Android手机Top 10排行榜

    原标题:2015 Q3中国大陆/香港/台湾最热门Android手机Top 10排行榜 前瞻科技快讯:昨晚,91 门户晒出 2015 年 Q3 中国大陆/香港/台湾最热门 Android 手机对比!To ...

  5. 必读!2018最具突破性计算机视觉论文Top 10

    转载自新智元(AI_era) [导读]本文总结了2018年以来最重要的10篇计算机视觉/图像生成相关的研究,包括许多新颖的架构设计,图像生成方面的突破等. 自从卷积神经网络在特定的图像识别任务上开始超 ...

  6. 7月Python和机器学习最佳开源项目Top 10!

    [导读]七月就要结束了,在即将到来的 7 月最后一个周末,人工智能头条为大家整理了本月 ML 和 Python 最受欢迎的十大开源项目.就算放假在家也可以知道大家现在都在学些什么,学习放假两不误.这个 ...

  7. Python 机器学习库 Top 10,你值得拥有!

    随着人工智能技术的发展与普及,Python 超越了许多其他编程语言,成为了机器学习领域中最热门最常用的编程语言之一.有许多原因致使 Python 在众多开发者中如此受追捧,其中之一便是其拥有大量的与机 ...

  8. OWASP TOP 10

    OWASP Open Web Application Security Project 官网:https://www.owasp.org/index.p... 下载:https://www.owasp ...

  9. 重磅 !《微信生态运营全景解读白皮书》,10 大热门场景、5 大案例剖析!

     今日,神策数据推出微信生态系列研究之<微信生态运营全景解读白皮书>,核心内容基于超 30 家标杆企业的深度访谈,从中你可以看到: · 微信生态趋势洞察与行动启示 · 微信生态的运营方法论 ...

最新文章

  1. java struts2配置_Struts2初始化配置的问题
  2. matlab svd分解
  3. Endnote 20.1 Mac Win 2021最新大客户稳定
  4. 《构建之法》阅读笔记4
  5. C# 将List中的数据导入csv文件中
  6. R语言之离群点检验(part2)--局部离群点因子LOF检验
  7. springmvc错误 Spring3.X jdk8 java.lang.IllegalArgumentException
  8. ResourceManager中的Resource Estimator框架介绍与算法剖析
  9. AOP切点表达式及通知类参数传递方式
  10. leetcode 154. 寻找旋转排序数组中的最小值 II(二分查找)
  11. 技术研究院006---B站自用的微服务框架——Kratos
  12. 使用LaTeX写论文
  13. IT项目经理成长手记
  14. 新学期可以制定目标计划并提醒的便签软件是哪款?
  15. 键盘上哪个键是ESCAPE键?
  16. Line 14: Char 22: runtime error: signed integer overflow: 1000000000 * 9 cannot be represented
  17. 【翻译】四种类型的为什么:产品背后的驱动力是什么?
  18. WiFi - 为啥WiFi信号的总是这么差?【附:解决方案】
  19. 微帧ROI视频智能编码:基于人眼感兴趣区域,实现极致观感体验
  20. 不限时长的录屏工具 captura

热门文章

  1. 电脑问题处理篇8:解决电脑启动时间过长问题
  2. 关于矩阵胶囊与EM路由的理解(基于Hinton的胶囊网络)
  3. 信用卡识别(1)-预处理
  4. 淘宝客月赚3000元的简单方法
  5. 家庭装修电路施工大全
  6. 大数据面试--20210611
  7. 去掉a标签超链接的虚线框的方法
  8. SHOW DBS在MongoDB中不显示我的自建库
  9. SCUD Busters POJ - 1264(凸包)
  10. 可以清理掉重复文件的PC软件