【C++】-- 哈希应用之布隆过滤器(二)

简介: 【C++】-- 哈希应用之布隆过滤器

五、布隆过滤器应用

1.找文件交集

给两个文件,分别有100亿个query,只有1G内存,如何找到两个文件交集?请给出近似算法和精确算法。

(1)近似算法

判断交集本质上是判断在不在,读取第一个query,将元素都映射到布隆过滤器中,再读取第二个文件中的query,判断每个query在不在布隆过滤器中,如果在就是交集。

(2)精确算法

假设每个query是20字节,100亿个query就是100亿*20个字节=2000亿KB=200GB,使用哈希切分

2.扩展布隆过滤器

如何扩展BloomFilter使得它支持删除元素的操作?

       布隆过滤器本不支持删除,这是由于布隆过滤器判断一个元素在不在时可能会存在误判,删除它对应的bit位时会影响其他元素,且多个元素可能会映射到同一bit位,因此删除某一bit位时会影响其他元素,可能会导致其他元素也被删除。

       不过可以采用以下方法让布隆过滤器支持删除元素:

       在布隆过滤器中找到该元素后,由于使用多个位表示一个元素,因此可以对布隆过滤器的每一个bit位使用计数来代替0/1(在不在),当有多个元素映射到该bit位时,该bit计数++ ,删除时,该bit计数--。

六、哈希应用

给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现?

1.找到出现次数最多的IP

(1)文件超过100G,不能加载到内存中,就需要将文件进行哈希切分,通过一个哈希函数,将log文件中的每个IP都转换为整数,如果IP相同,那么转换后的整数也相同,就会映射到同一个小文件中。

(2)切分成小文件后就可以加载到内存了,对于每次加载到内存的小文件,使用map<string,int>对该小文件中的所有IP进行次数统计,找出出现次数最多的IP。

(3)将每个文件中出现次数最多的IP再使用map<string,int>进行统计,就能找到出现次数最多的那个IP了。

另外:将文件切分为100个小文件,这100个小文件并不是均匀切分的,有的可能会小于1G,有的则可能会大于1G,当有几十个文件都大于1G时,可以考虑将文件直接切分为200份,而不是100份,这样每个小文件大约为512MB。

2. 找到top K的IP

(1)对100G的文件建堆,内存放不下,因此还是要切分成小文件,如上图中将100G的大文件利用哈希函数切分成100个小文件。

(2)将第一个文件加载到内存中,对第一个小文件建有K个元素的小堆,只要比堆顶元素大就进堆,最后堆里剩下的就是第一个小文件中出现次数最多的K个IP。

(3)将剩下的其它小文件依次加载到内存,每加载一个小文件,就将该小文件中的所有IP和堆顶元素进行比较,只要比堆顶元素大,就进堆。最后堆里留下的就是出现次数最多的K个IP。

3.用Linux系统命令实现找到top K的IP

假如有以下文件IP.log:

1. 192.168.1.5
2. 69.52.220.44
3. 10.152.16.23
4. 192.168.3.10
5. 192.168.1.4
6. 192.168.2.1
7. 192.168.0.9
8. 10.152.16.23
9. 192.163.0.9
10. 192.168.0.9
11. 69.52.220.44
12. 192.168.1.4
13. 192.168.1.5
14. 192.163.0.9
15. 192.168.2.1
16. 192.168.0.1
17. 192.168.0.2
18. 192.168.0.9
19. 9.9.9.9
20. 127.0.0.1
21. 192.168.0.90
22. 192.168.0.89
23. 192.168.0.8
24. 192.168.0.9
25. 192.163.0.9

(1)按行排序,并将结果输出到标准输出

sort 文件名

(2)统计并显示文本文件中出现的行或列的次数

uniq -c

(3)根据出现次数倒序排序

sort -r

(4)查看开头K行

head -k

显示出现次数最多的前K个IP

相关文章
|
7月前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
190 15
|
4月前
|
机器学习/深度学习 存储 算法
基于 C++ 布隆过滤器算法的局域网上网行为控制:URL 访问过滤的高效实现研究
本文探讨了一种基于布隆过滤器的局域网上网行为控制方法,旨在解决传统黑白名单机制在处理海量URL数据时存储与查询效率低的问题。通过C++实现URL访问过滤功能,实验表明该方法可将内存占用降至传统方案的八分之一,查询速度提升约40%,假阳性率可控。研究为优化企业网络管理提供了新思路,并提出结合机器学习、改进哈希函数及分布式协同等未来优化方向。
101 0
|
7月前
|
存储 算法 安全
企业员工数据泄露防范策略:基于 C++ 语言的布隆过滤器算法剖析[如何防止员工泄密]
企业运营过程中,防范员工泄密是信息安全领域的核心议题。员工泄密可能致使企业核心数据、商业机密等关键资产的流失,进而给企业造成严重损失。为应对这一挑战,借助恰当的数据结构与算法成为强化信息防护的有效路径。本文专注于 C++ 语言中的布隆过滤器算法,深入探究其在防范员工泄密场景中的应用。
124 8
|
8月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
262 12
|
9月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
191 5
|
12月前
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
241 5
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
8月前
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。
|
4月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
105 0
|
4月前
|
存储 编译器 程序员
c++的类(附含explicit关键字,友元,内部类)
本文介绍了C++中类的核心概念与用法,涵盖封装、继承、多态三大特性。重点讲解了类的定义(`class`与`struct`)、访问限定符(`private`、`public`、`protected`)、类的作用域及成员函数的声明与定义分离。同时深入探讨了类的大小计算、`this`指针、默认成员函数(构造函数、析构函数、拷贝构造、赋值重载)以及运算符重载等内容。 文章还详细分析了`explicit`关键字的作用、静态成员(变量与函数)、友元(友元函数与友元类)的概念及其使用场景,并简要介绍了内部类的特性。
176 0