必知C++算法之大数据相关基本内容

Map-Reduce和Hadoop热门
常见海量处理题目解题关键

1.分而治之。通过哈希函数将大任务分流到机器,或分流成小文件

2.常用的hashMap或bitmap

难点:通讯,时间和空间的估算。

请对10亿个IPV4的ip地址进行排序,每个IP只会出现一次

IPV4的ip数量约等于42亿

ip->转化为无符号整数

10亿个ip->转化为10亿个整数(每个整数4字节,空间约为4G)

更好的方法是申请长度为2的32次方的bit类型的数组(空间约为500M) bitmap

请对10亿人的年龄进行排序

用个长度为200的数组,年龄计数排序即可

有个包含20亿个全是32位整数的大文件,在其中找到出现次数最多的数,但是内存限制只有2G

hashmap记录所有数出现的次数

具体某一个数:key->整形4字节

这个数出现的次数:value->整形4字节

一条记录占有8字节,记录2亿时,大约1.6G内存

所以用哈希表来直接统计20亿个整数的方案,可能内存不足

正确方法:

使用哈希函数进行分流,可以分n个文件

桶一种数不会被分流到不同文件,这是哈希函数性质决定的。

对于不同的数,每个文件种含有整数的种数机会一样,这也是哈希函数性质决定的。

全部处理完成后,等到n个文件种各自的第一名

再在n个第一名中,再选出其中的第一名即可

32位无符号整数的范围时0~4294967295。现在正好有一个包含40亿个无符号整数的文件,所以在整个范围中必然有没有出现过的数。可以使用最多10M的内存,只用找到一个没出现过的数即可,该如何找。

将0~2的32次方-1范围分成64个区间

单个区间应该装下2的32次方/64个数(这个64是按照给的内存来选择的)

总共范围约为42亿,但数一共为40亿,所以必然会有区间计数不足2的32次方/64

此区间为A,再遍历一次40亿个数,此时只关注区间A上的数,并用bitmap统计区间A上的数出现的情况。占用500m/64约等于8m,找到一个在区间A上没出现的数即可

某搜索公司一天的用户搜索词汇是海量的,假设有百亿的数据量,请设计一种求出每天最热100词的可行方法。

百亿数据使用哈希函数进行分流到n台机器上,如果每个机器上内存仍然不足,可以再使用哈希函数再每台机器上再进行分流,分成若干个小文件,处理每一个小文件,得到每个小文件中词汇的词频统计。

建立记录后,利用小根堆来进行TOP100筛选。

利用小根堆或者外排序合并小文件中的TOP100,获得每台机器上的TOP100

再利用小根堆或者外排序将每台机器上的TOP100合并,获得总体TOP100

工程师常使用服务器集群来设计和实现数据缓存,以下是常见的策略。1.无论是添加、查询还是删除数据,都先将数据的id通过哈希函数转换成一个哈希值,记为key。2.如果目前机器有N台,则计算key%N的值,这个值就是该数据所属的机器编号,无论是添加、删除还是查询操作,都只在这台机器上进行。请分析这种缓存策略可能带来的问题,并提出改进的方案

潜在问题:

​ 如果增加或删除机器,数据迁移的代价很大。

所有数据必须重新计算哈希值,以及对新的机器数M取余,来决定各自数据的归属。

数据缓存很好的设计方案为:

​ 一致性哈希算法

数据id通过哈希值后的结果在0~2的32次方范围内

将这些数字首尾相连,想象成一个环形,将n台机器id通过哈希值计算出在环中的位置,其他的数据id顺时针找到最近的机器,即为其归属机器

这种做法添加机器以及卸载机器时的代价都是很小的,只需要对局部数据进行迁移即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值