分享一道面试题
Bitmap处理大数据量的数据赛选
背景:
用户注册时,系统会随机分配一个7-8位纯数字ID。要求保留6类规则的靓号,不被分配出去。
靓号规则如下
顶级靓号, // AABBCC AAABBB ABABAB ABCABC 6A 7A
精品靓号, // 3A 3顺 4A 4顺 5A 5顺
爱情靓号, // 520 521 920 921 1314 1711 9421 包括其中之一即算匹配
生日靓号, // YYYYMMDD YYYYMDD/YYYYMMD YYYYMD/YYMMDD 为方便计算,只考虑1970至2020年之间的生日
手机靓号, // 134 135 136 137 138 130 131 186 180 189 包括其中之一即算匹配
普通靓号, // AABB ABAB
分析:
7-8位纯数字忽略0打头则范围是1000000 - 99999999 一共99000000个数
int长度4字节 32bit 需要一维数组长度 99000000/32 = 3093750 N = 3093750
最小角标应该从0开始 实际最小角标为 1000000/32 = 31250 所以计算的角标均减去常量 M = 31250
由于点阵数据重复对查询结果没有影响 所以在生成靓号的过程中不考虑重复出现的数据
* 处理过程分4步走,前三步为一次性动作
* 1、根据靓号规则生成基础靓号
* 2、根据数字长度要求,通过补位算法来满足数据长度 7 - 8 位
* 3、生成的靓号放入bitmap中
* 4、生成随机数并判断是否在bitmap中
伪代码:
1、生成基础靓号
//AAABBB
2、补位,保存到文件
3、从本地文件加载靓号放到bitmap
4、判读是否为靓号