海量数据处理

常用的几种方法:

1、分治法/Hash映射 + hash_map

a、将海量数据通过Hash映射为若干的小文件;

b、利用hash_map对每个小文件进行统计(key为数据内容,value为出现次数);

 

2、Bloom Filter

Bloom Filter是一种允许有少量错误的数据判重或者集合求交集的方法。

具体内容以及公式参考博客Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容)

a、 建立一个长度为m的位数组+ k个独立的hash函数(若输入的元素个数为n,则错误率为0.01时一般m=13*n,k=8);

b、 输入一个元素,经过k个hash函数映射后,将位数组相应位置置1;

c、 若一个数据对应的所有位置都为1,则该数据很可能已经出现过,若不全为1,则肯定没有出现过。

缺点:不能保证结果完全正确;只支持插入和查找,不支持删除;

优点:节省内存。

改进:CountingBloom Filter

            它将标准BloomFilter位数组的每一位扩展为一个小的计数器(Counter),在插入元素时给对应的k(k为哈希函数个数)个Counter的值分别加1,删除元素时给对应的k个Counter的值分别减1。)

3、Bitmap

Bitmap是一种和Bloom Filter差不多的概念,用bit的值来标记某个元素对应的Value,Key为该元素,常用于统计重复数据,以及两个集合之间的比较。

 

4、Trie树

Trie树,即字典树,又称单词查找树或键树。

常用于统计和排序大量字符串或者单词。

Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

优点:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

 

它有3个基本性质:

a、根节点不包含字符,除根节点外每一个节点都只包含一个字符。

b、从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。

c、每个节点的所有子节点包含的字符都不相同。

好比假设有b,abc,abd,bcd,abcd,efg,hii 这6个单词,我们构建的树就是如下图这样的:

 

5、外排序

当待排序的文件很大,内存不够,就不能使用内部排序,需要做内外存内容的交换。外排序其实也是归并排序。具体内容以及公式参考博客外排序

例如对4500个记录排序,但是内存只能存750个记录。

第一步:将数据分为6份,每次对其中一份进行内部排序,并将结果存到一个外部存储器。

第二步:将内存分成3份,其中两份作为输入缓冲区,一份作为输出缓冲区。从Segment_1中取250个数据,从Segment_2中取250个数据,将归并结果存入输出缓冲区(满了之后移入临时缓冲区),输入缓冲区空了之后从相应的归并段继续取,直到排序结束。重复,直到所有排序结束。

 

6、桶排序

将数据划分为间距相同的桶,不同大小的数据放到相应的桶里面,主要用于查找处于海量数据中某一区间内的数据,如查找中位数。

7、最大堆、最小堆

主要用于解决Top K 问题

取前K个数据,维护一个最大堆(取最小的K个数),维护一个最小堆(取最大的K个数)。

常见题目参考博客

十七道海量数据处理面试题与Bit-map详解

1. 内容概要 本项目是一个支持科学函数的命令行计算器,兼容 C++98 标准。它实现了中缀表达式词法分析、后缀表达式转换与求值,支持常见数学运算(如幂、三角函数、对数等)与括号优先级解析。程序还提供了角度版三角函数、角度与弧度互转功能,并支持函数调试输出与函数演示模式。 2. 适用人群 * C++ 初中级学习者,特别是希望深入理解表达式求值机制者 * 需要一个可扩展的计算引擎的项目开发者 * 想通过项目实践词法分析、调度场算法、数学函数封装的开发者 * 高校学生课程设计、编译原理实践者 3. 使用场景及目标 * 实现中缀表达式的完整求解器,支持函数嵌套、优先级与结合性处理 * 提供角度与弧度版本的三角函数,以适应不同输入偏好 * 演示中缀转后缀过程,辅助编程教育与算法教学 * 提供科学函数辅助计算,如 `log`, `sqrt`, `abs`, `exp`, `ceil`, `floor` 等 4. 其他说明 * 支持函数:sin, cos, tan(弧度);sind, cosd, tand(角度) * 支持函数嵌套,如 `sin(deg2rad(30))` * 支持操作符:+, -, \*, /, ^, \*\*(幂运算)与括号优先级 * 所有函数均通过 map 注册,方便扩展与自定义 * 输入 `help` 查看支持函数,`demo` 观看转后缀过程,`quit` 退出程序 * 提示用户避免使用 `°` 符号,推荐使用角度函数代替 * 可通过 `g++ calculator.cpp -o calculator -lm` 编译(需链接数学库)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值