一、问题描述:

1.在42亿个qq号码中,如何使用O(1)时间复杂度去查找一个QQ号是否存在。

2.qq号的位数小于13位,存储着42亿QQ号的内存不得超过600MB.

二、位图排序思想

由于待排序的数据记录较多,我们单纯地使用常见的排序方法时间效率较低,运行时间会很长。而且内存空间有限(限制为1MB左右),所以我们不能同时把所有整数读入内存(如果每个整数使用7个字节来存储,那么1MB内存空间只能存大约143000个数字)。当然我们可以多次读取输入文件,多次排序,但是更好的方案是使用位图排序,可以使用有限的1MB内存空间并只进行一趟排序。

1.根据待排序集合中最大的数,开辟一个位数组,用来表示待排序集合中的整数;

2.待排序集合中的数字在位数组中的对应位置置1,其他的置0;

例如,待排序集合{1,2,3,5,8,13}可以表示为:0-1-1-1-0-1-0-0-1-0-0-0-0-1

这样排序过程自然可以分为三步:

第一步:将所有的位都置为0;

第二步:通过读入文件中的每个整数,将每个对应的位都置为1;

第三步:检验每一位,如果该位为1,输出对应的整数。

注意:位图排序是使用一个二进制位而不是一个整数来表示0或1,这样可以大大地减少所需要的内存空间。使用位图排序的前提是要知道待排序序列中的最大数。位图排序的缺点是有些数没有出现过,仍要为其保留一个位。故位图排序比较适合关键字密集的序列,例如一个QQ号码。

/*Phase 1: initialize set to empty*/for
i = [0, n)bit[i] = 0/*Phase 2: insert present elements into the set*/for
each i in the input filebit[i] = 1/*Phase 3: write sorted output*/for
i = [0, n)if
bit[i] == 1write i on the output file

三、使用位图排序的方法

位图排序时,我们需要考虑:给出一个数,如何找到其对应位图的位置,方法就是首先找到该数对应的字节,然后在找到该数对应的位。例如一个QQ号是:983262245,则将bit的98326625位进行标记。bitset是C++提供的一种位集合的数据结构,它让我们可以像使用数组一样使用位,可以访问指定下标的bit位。因此将通过bitset容器进行存储42个qq号码。由于一个字节可以存放8个QQ号码,则4200000000/8/1014/1024 = 500.679Mb,内存合适,通过bit位下表来判断QQ号码是否存在。

#include<iostream>
#include<bitset>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const unsigned int MAX = 4200000010;
typedef unsigned int UT;
bitset<MAX> bit;
int main(){//开始存储QQfor(UT i=1;i<10;i++){UT qq;printf("请输入第%d个QQ号:",i);scanf("%d",&qq); bit.set(qq);} UT qq;printf("请输入:");while(scanf("%d",&qq)!=0){if(bit.test(qq)){printf("Yes\n");}printf("请输入:");}return 0;
} 

存储:空间占用大约500Mb

查找:时间复杂度为O(1)

通过位排序的方法,在实现内存内,实现在O(1)时间复杂度内进行一个QQ号码的查找。

42亿QQ,O(1)时间复杂度完成查找相关推荐

  1. 中国即时通信用户6.42亿 企业市场竞争将更激烈

    8月3日消息,中国互联网络信息中心(CNNIC)今日发布第38次<中国互联网络发展状况统计报告>.报告显示,截至2016年6月,网民中即时通信用户规模达到6.42亿,较2015年底增长17 ...

  2. 2亿QQ用户大调度背后的架构设计和高效运营(上)

    作者介绍 周小军 腾讯高级运维工程师,目前在腾讯社交负责社交业务海量NoSQL集群运维和团队管理.曾在天涯社区任运维副总监.对互联网网站架构.数据中心.云计算及自动化运维等领域有深入研究和理解,积累了 ...

  3. 金山办公:2021年净利润10.42亿元,同比增长19%

    2月26日消息,日前,金山办公发布公告称,2021年公司实现营业收入32.80亿元,同比增长45.07%:利润总额11.19亿元,同比增长19.54%:归属于母公司所有者的净利润10.42亿元,同比增 ...

  4. 全球 42 亿 IPv4 地址宣告耗尽!

    整理 | 郭芮 IPv4 是互联网的核心,也是使用最广泛的网际协议版本. 长期以来,全球 IPv4 地址耗尽令人担忧,今天这一时刻终于来临--负责英国.欧洲.中东和部分中亚地区互联网资源分配的欧洲网络 ...

  5. 一天赚148万元,科大讯飞2018年净利润达5.42亿,但53%为政府补助

    AI时代下,较早布局和拥有核心技术的公司愈加拥有竞争力. 作为A股AI第一股,科大讯飞过去一年发展极为迅猛. 近日,科大讯飞发布2018年财报,财报显示该公司过去一年实现营收79.17亿元,毛利润39 ...

  6. ​邦基科技上交所上市:市值42亿 王由成家族色彩浓厚

    雷递网 雷建平 10月19日 山东邦基科技股份有限公司(简称:"邦基科技",股票代码为:"603151")日前递交招股书,准备在上交所主板上市. 邦基科技此次发 ...

  7. 我的世界Java种子算法_我的世界地图种子竟然有42亿个 那些神奇的建筑都是怎么生成的...

    <我的世界>地图种子都是由数据代码随机生成的,所以就造成了每次生成的地图都不会相同,这样的地图竟然可以生成出42亿个,每天玩1张地图,一辈子都玩不玩. 今天"我的世界中文分享站& ...

  8. 我的世界java版地图结构_我的世界地图种子竟然有42亿个 那些神奇的建筑都是怎么生成的...

    <我的世界>地图种子都是由数据代码随机生成的,所以就造成了每次生成的地图都不会相同,这样的地图竟然可以生成出42亿个,每天玩1张地图,一辈子都玩不玩. 今天"我的世界中文分享站& ...

  9. 利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?

    ​参考: 腾讯43亿QQ号码用完后怎么办? 腾讯三面:40亿个QQ号码如何去重 一.背景: 首先,明确两点: QQ号是 unsigned int 类型(4字节无符号整数,共32bit), 也就是说 Q ...

最新文章

  1. mysql 联接结果集函数_Oracle 中函数如何返回结果集
  2. python3笔记_python3基础笔记(一)
  3. python的难点_汇总Python初学者常见的学习难点
  4. E数据结构实验之查找五:平方之哈希表
  5. 上海大厂Java面试经历:初步理解类加载运行机制和类加载过程
  6. A quick presentation of the Visual Studio 2010 editions per role
  7. 从word得到表格数据插入数据库(6位行业代码)
  8. 主键思维定势导致的惨案
  9. 高级软件工程第六次作业:东理三剑客团队作业-3
  10. sql语句回忆录1-多表连接子查询
  11. 【JSP进阶】JSP九大内置对象,这你也不知道?
  12. 中兴B860AV2.1、1.1T、2.1-A-M-T,通刷线刷固件及教程
  13. 爱快iKuai软路由系统远程升级(从2.5.10系统升级至3.X系列)教程(图文详解)
  14. YOLO文章详细解读
  15. iOS App 打包上架AppStore超详细流程
  16. 外贸常用术语_外贸业务中常用的术语
  17. Jenkins安装插件报错解决方法
  18. 监控平台设计 之 Graphite、Prometheus 竞对
  19. 『ANDROID』android animator 动画
  20. vue+css3动画开发发牌、翻牌效果

热门文章

  1. html设置%3cbody%3e背景颜色,使用css写带纹理渐变背景图的示例代码
  2. “ChatGPT的问题、风险与机遇”会议综述
  3. 基于高德地图的app开发打包报错
  4. 聊聊Jdk中你没听过的关键词-synthetic
  5. 线性回归算法原理推导
  6. 实在智能与光云科技战略合作,强强联手推进电商数智化转型
  7. 半路出家的程序员,学到什么程度就能出去找工作了?
  8. tagwriter汉化版_【NFC TagWriter by NXP】安卓下载_NFC TagWriter by NXPv3.8.60最新手机版下载-91手游网...
  9. 【深度学习入门-1】透彻理解卷积的三层含义:从“卷积”、到“图像卷积操作”、再到“卷积神经网络”的含义(学习笔记)
  10. 三羊献瑞+祥瑞生辉(15年蓝桥杯)