当前位置:网站首页>面试之 top k问题
面试之 top k问题
2022-07-03 16:17:00 【左海峰博客】
从大量数据里查找前多少大或者小的数据。
第一个例子:有4g内存,有1千万ipv4的地址。找其中出现次数最多的前100个。 设ipv4地址192.168.111.222。以字符串15个char,每个char两个字节。每个地址30字节存储。1千万就是3亿字节。 3亿字节 = 0.3g。所以内存够用。ipv4如果转为int存储。内存更小。
1.在内存够用的前提下:
首先进行统计。 再排序。
做出一个k,v的结构。每一个ip出现多少次。可以通过hashmap或者数组进行映射。 统计后排序找最大或最小。(这里的排序与堆排序有所不同) 比如找前100大的,我们假设先把hashmap或数组中的前100个当做最大的,只要记录这里边最小的那个。然后与新的数作比较。 大就留下把记录的那个丢掉,小的话就过。 借助顶堆降低复杂度。前一百大使用小顶堆,前一百小使用大顶堆。 比如找前100大的,可以创建一个100个节点的小顶堆,在维护小顶堆的时候与堆排序有所不同。堆排序是将所有的节点构造成一个堆,然后维护好之后呢他是每次将堆顶和最后一个节点互换位置。互换后将最后那个节点去掉。 这里的排序是维护一个100节点的堆。这个堆的大小不会改变。然后就是遍历咱们统计的那个hashmap或者是数组。先把前100个近似看作是出现最多的做成一个小顶堆。然后开始遍历第101个,每次与堆顶比较。如果比堆顶大。就与堆顶进行交换。交换完成后维护小顶堆。维护好就比较第102个数。这样依次比较下去就能得到前100个出现次数最多的堆。 复杂度nlogm,n代表这1千万,m代表前100。
2.内存不够:
给了100g的文本。文本出现如下两列,一个是ip地址,一个是url。找出url被不同的ip访问的次数的前100多的。 给了4g的机器,无限的硬盘。
1.2.3.4 baidu.com
1.2.3.4 taobao.com
1.2.3.3 taobao.com
1.2.2.2 baidu.com
1.2.2.2 baidu.com
这里就是baidu是2个,taobao也是2个。
1.有没有更多的机器。可以多机器处理,每个机器处理一部分。
2.借用现有的软件比如mysql。通过sql语句查出来。
3.借助硬盘排序。按照域名命名文件。把访问这个域名的ip放进来,或者使用hash,对域名进行对n求余,将相同的域名数据放入到同一个文本便于统计。 统计时读取文件,不需要把所有的文件都放在内存中,读一个文件把域名对应独立ip的个数统计一下。 统计完成之后又可以借助顶堆计算。
边栏推荐
- Jmeter线程组功能介绍
- PHP二级域名session共享方案
- Slam learning notes - build a complete gazebo multi machine simulation slam from scratch (4)
- ASEMI整流桥UMB10F参数,UMB10F规格,UMB10F封装
- Pychart error updating package list: connect timed out
- Client does not support authentication protocol requested by server; consider upgrading MySQL client
- Detailed explanation of four modes of distributed transaction (Seata)
- Getting started with Message Oriented Middleware
- Go language self-study series | if else if statement in golang
- 程序猿如何快速成长
猜你喜欢

0214-27100 a day with little fluctuation

【Proteus仿真】74HC595+74LS154驱动显示16X16点阵
![[combinatorics] non descending path problem (outline of non descending path problem | basic model of non descending path problem | non descending path problem expansion model 1 non origin starting poi](/img/81/59ed6bebf5d85e9eb71bd4ca261309.jpg)
[combinatorics] non descending path problem (outline of non descending path problem | basic model of non descending path problem | non descending path problem expansion model 1 non origin starting poi

“用Android复刻Apple产品UI”(3)—优雅的数据统计图表

8个酷炫可视化图表,快速写出老板爱看的可视化分析报告

How can technology managers quickly improve leadership?

Détails du contrôle de la congestion TCP | 3. Espace de conception

Slam learning notes - build a complete gazebo multi machine simulation slam from scratch (4)
![[system safety] 43 PowerShell malicious code detection series (5) automatic extraction of ten thousand words from abstract syntax tree](/img/cd/00954b9c592c253d42e6a3b8298999.jpg)
[system safety] 43 PowerShell malicious code detection series (5) automatic extraction of ten thousand words from abstract syntax tree

Stm32f103c8t6 firmware library lighting
随机推荐
Nine ways to define methods in scala- Nine ways to define a method in Scala?
如何在本机搭建SVN服务器
Unity项目优化案例一
远程办公之大家一同实现合作编辑资料和开发文档 | 社区征文
Everyone in remote office works together to realize cooperative editing of materials and development of documents | community essay solicitation
The mixlab editing team is recruiting teammates~~
The difference between calling by value and simulating calling by reference
Construction practice camp - graduation summary of phase 6
[solved] access denied for user 'root' @ 'localhost' (using password: yes)
PHP中register_globals参数设置
探索Cassandra的去中心化分布式架构
Is it safe to open an account with flush?
8个酷炫可视化图表,快速写出老板爱看的可视化分析报告
TCP拥塞控制详解 | 3. 设计空间
Unity project optimization case 1
请求头不同国家和语言的表示
Custom plug-in construction and use of QT plug-in
Leetcode binary search tree
QT串口ui设计和解决显示中文乱码
跟我学企业级flutter项目:简化框架demo参考