分享一道面试题

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

 Clipboard Image.png

2、补位,保存到文件

 Clipboard Image.png

 Clipboard Image.png

3、从本地文件加载靓号放到bitmap

 Clipboard Image.png

4、判读是否为靓号

 Clipboard Image.png

原文地址:https://www.cnblogs.com/dbycl/p/7474110.html