牛客网常见算法思路 (十一)大数据处理

本文探讨了在有限资源下处理大规模数据集的有效策略,包括使用hashmap和bitmap进行数据分布、排序和查找,以及如何设计系统以应对大规模数据的挑战。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有用麻烦点个赞哦

解题关键
1、分而治之,通过hash将大任务分流到机器
2、常用的hashMap或bitMap
难点:通讯、时间、空间的估算
这类型的题目适合面试不适合笔试

案例一
请对10亿个ipv4地址进行排序,每个ip只会出现一次
ipv4约等于42亿
普通方法
ip地址转化无符号整数,排序后再转化为ip地址
一个ip地址大约4字节,10亿个整数约4G
更优解
1、申请一个长度为2^32的bit类型数组,每个位置只可表示1或0,共128m
2、因为长为2^32,所以bitmap可以表示任何一个32位无符号数,当对应的数出现时,bitmap对应位置涂黑,重复10亿次
3、从0位置开始遍历,把ip地址还原

案例二
请对10亿个数进行排序
思想
年龄必定在0-200之间,计数排序即可

案例三
一个包含20亿个32位整数的大文件,在其中找到出现次数最多的数,但是内存限制只有2G
思想
hashmap记录所有数出现的次数
key->4字节->整型->具体某一个数
value->4字节->整型->这种数出现的次数
一条记录8字节,记录条数为2亿是,大约1.6G内存,20亿时内存可能不足(如果出现20亿个数都不一样)
因此要先用hash函数分流成16个小文件
因为同一个文件不会被分流到不同的部分,全部处理完成后,得到16个文件中各自的第一名再比较出第一名

案例四
32位无符号整数的范围0-4294967295。现在有一个正好包含40亿个无符号整数的文件,所以在整个范围中必然有没出现过的数,可以使用最多10M的内存,只用找到一个没出现的数,如何寻找
思想
hashmap记录,需要16G内存
bitmap记录,需要500M
首先0-232-1范围分成64个区间,单个区间232/64
总范围42亿,但数一共为40亿,所以必然有区间计数不满
找到一个没满的区间用bitmap检索一边即可

案例五
搜索词汇量是百亿的搜索公司,设计出每天最热词100的可行办法
思想
还是先hash分流(具体机器和面试官沟通得出),甚至还可以分流后再分流
处理每一个小文件,得到每个小文件中的词频统计,利用小根堆选出top100
小文件的top100汇总外排序或小根堆求出每台机器的top100,再求出最后的top100

案例六
工程师常使用服务器集群来设计和实现数据缓存,以下是常见的策略。1、无论是添加、查询还是删除,都先将数据的id通过哈希函数转换成一个hash值,记为key。2、如果目前有机器N台,则计算key%N的值,这个值就是该数据所属的机器编号,无论是添加、删除、还是查询,都只在这台机器上进行。请分析这种缓存策略可能带来的问题,并提出改进方案
思考
如果增加/删除机器,数据迁移的代价很大
一致性哈希算法(建议详细了解)
数据id hash计算后结果0-2^32,假设收尾相连成环
假设机器问n个,均匀分布在环上,数据id映射在环上一点,向前走遇到第一台机器的节点,就存储在当前机器节点上,增加删除节点时只需要移动变动节点附近的数据即可。

有用麻烦点个赞哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值