当前位置:网站首页>面试之 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的个数统计一下。 统计完成之后又可以借助顶堆计算。
边栏推荐
- Is it safe to open an account with flush?
- [combinatorics] summary of combinatorial identities (eleven combinatorial identities | proof methods of combinatorial identities | summation methods)*
- The mixlab editing team is recruiting teammates~~
- Pychart error updating package list: connect timed out
- TCP拥塞控制详解 | 3. 设计空间
- Client does not support authentication protocol requested by server; consider upgrading MySQL client
- pyinstaller不是内部或外部命令,也不是可运行的程序 或批处理文件
- 近视:摘镜or配镜?这些问题必须先了解清楚
- 六月 致 -.-- -..- -
- Why does the std:: string operation perform poorly- Why do std::string operations perform poorly?
猜你喜欢
[web security] - [SQL injection] - error detection injection
[redis foundation] understand redis persistence mechanism together (rdb+aof graphic explanation)
【Proteus仿真】8×8LED点阵屏仿电梯数字滚动显示
NSQ源码安装运行过程
Google Earth engine (GEE) - daymet v4: daily surface weather data set (1000m resolution) including data acquisition methods for each day
[list to map] collectors Tomap syntax sharing (case practice)
"Remake Apple product UI with Android" (2) -- silky Appstore card transition animation
跟我学企业级flutter项目:简化框架demo参考
【Proteus仿真】74HC595+74LS154驱动显示16X16点阵
探索Cassandra的去中心化分布式架构
随机推荐
Chinese translation of Tagore's floating birds (1~10)
Slam learning notes - build a complete gazebo multi machine simulation slam from scratch (II)
"Remake Apple product UI with Android" (3) - elegant statistical chart
特征多项式与常系数齐次线性递推
[web security] - [SQL injection] - error detection injection
疫情常态化大背景下,关于远程办公的思考|社区征文
Record windows10 installation tensorflow-gpu2.4.0
Remote file contains actual operation
First knowledge of database
Client does not support authentication protocol requested by server; consider upgrading MySQL client
From "zero sum game" to "positive sum game", PAAS triggered the third wave of cloud computing
The mixlab editing team is recruiting teammates~~
记一次jar包冲突解决过程
How to use AAB to APK and APK to AAB of Google play apps on the shelves
架构实战营 - 第 6 期 毕业总结
Pyinstaller is not an internal or external command, nor is it a runnable program or batch file
Unity project optimization case 1
Jmeter线程组功能介绍
《天天数学》连载56:二月二十五日
Thinking about telecommuting under the background of normalization of epidemic | community essay solicitation