范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

腾讯三面40亿个QQ号码如何去重?

  今天,我们来聊一道常见的考题,也出现在腾讯面试的三面环节,非常有意思。具体的题目如下:
  文件中有40亿个QQ号码,请设计算法对QQ号码去重,相同的QQ号码仅保留一个,内存限制1G.
  这个题目的意思应该很清楚了,比较直白。为了便于大家理解,我来画个动图 玩玩,希望大家喜欢。
  能否做对这道题目,很大程度上就决定了能否拿下腾讯的offer,有一定的技巧性,一起来看下吧。
  在原题中,实际有40亿个QQ号码,为了方便起见,在图解和叙述时,仅以4个QQ为例来说明。
  方法一:排序
  很自然地,最简单的方式是对所有的QQ号码进行排序,重复的QQ号码必然相邻,保留第一个,去掉后面重复的就行。
  原始的QQ号为:
  排序后的QQ号为:
  去重就简单了:
  可是,面试官要问你,去重一定要排序吗?显然,排序的时间复杂度太高了,无法通过腾讯面试 。
  方法二:hashmap
  既然直接排序的时间复杂度太高,那就用hashmap吧,具体思路是把QQ号码记录到hashmap中: mapFlag[123] = true mapFlag[567] = true mapFlag[123] = true mapFlag[890] = true
  由于hashmap的去重性质,可知实际自动变成了: mapFlag[123] = true mapFlag[567] = true mapFlag[890] = true
  很显然,只有123,567,890存在,所以这也就是去重后的结果。
  可是,面试官又要问你了:实际要存40亿QQ号码,1G的内存够分配这么多空间吗?显然不行,无法通过腾讯面试 。
  方法三:文件切割
  显然,这是海量数据问题。看过很多面经的求职者,自然想到文件切割的方式,避免内存过大。
  可是,绞尽脑汁思考,要么使用文件间的归并排序,要么使用桶排序,反正最终是能排序的。
  既然排序好了,那就能实现去重了,貌似就万事大吉了。我只能坦白地说,高兴得有点早哦。
  接着,面试官又要问你:这么多的文件操作,效率自然不高啊。显然,无法通过腾讯面试 。
  方法四:bitmap
  来看绝招!我们可以对hashmap进行优化,采用bitmap这种数据结构,可以顺利地同时解决时间问题和空间问题。
  在很多实际项目中,bitmap经常用到。我看了不少组件的源码,发现很多地方都有bitmap实现,bitmap图解如下:
  这是一个unsigned char类型,可以看到,共有8位,取值范围是[0, 255],如上这个unsigned char的值是255,它能标识0~7这些数字都存在。
  同理,如下这个unsigned char类型的值是254,它对应的含义是:1~7这些数字存在,而数字0不存在:
  由此可见,一个unsigned char类型的数据,可以标识0~7这8个整数的存在与否。以此类推: 一个unsigned int类型数据可以标识0~31这32个整数的存在与否。  两个unsigned int类型数据可以标识0~63这64个整数的存在与否。
  显然,可以推导出来:512MB大小足够标识所有QQ号码的存在与否,请注意:QQ号码的理论最大值为2^32 - 1,大概是43亿左右。
  接下来的问题就很简单了:用512MB的unsigned int数组来记录文件中QQ号码的存在与否,形成一个bitmap,比如: bitmapFlag[123] = 1 bitmapFlag[567] = 1 bitmapFlag[123] = 1 bitmapFlag[890] = 1
  实际上就是: bitmapFlag[123] = 1 bitmapFlag[567] = 1 bitmapFlag[890] = 1
  然后从小到大遍历所有正整数(4字节),当bitmapFlag值为1时,就表明该数是存在的。
  而且,从上面的过程可以看到,自动实现了去重。显然,这种方式可以通过腾讯的面试 。
  扩展练习一
  文件中有40亿个互不相同的QQ号码,请设计算法对QQ号码进行排序,内存限制1G.
  很显然,直接用bitmap, 标记这40亿个QQ号码的存在性,然后从小到大遍历正整数,当bitmapFlag的值为1时,就输出该值,输出后的正整数序列就是排序后的结果。
  请注意,这里必须限制40亿个QQ号码互不相同。通过bitmap记录,客观上就自动完成了排序功能。
  扩展练习二
  文件中有40亿个互不相同的QQ号码,求这些QQ号码的中位数,内存限制1G.
  我知道,一些刷题经验丰富的人,最开始想到的肯定是用堆或者文件切割,这明显是犯了本本主义错误。直接用bitmap排序,当场搞定中位数。
  扩展练习三
  文件中有40亿个互不相同的QQ号码,求这些QQ号码的top-K,内存限制1G.
  我知道,很多人背诵过top-K问题,信心满满,想到用小顶堆或者文件切割,这明显又是犯了本本主义错误。直接用bitmap排序,当场搞定top-K问题。
  扩展练习四
  文件中有80亿个QQ号码,试判断其中是否存在相同的QQ号码,内存限制1G.
  我知道,一些吸取了经验教训的人肯定说,直接bitmap啊。然而,又一次错了。根据容斥原理可知:
  因为QQ号码的个数是43亿左右(理论值2^32 - 1),所以80亿个QQ号码必然存在相同的QQ号码。
  海量数据的问题,要具体问题具体分析,不要眉毛胡子一把抓。有些人完全不刷题,肯定不行。有些人刷题后不加思考,不会变通,也是不行的。好了,先说这么多。我们也会一步一个脚印,争取每篇文章讲清讲透一件事,也希望大家阅读后有所收获,心情愉快。

陶石泉白手起家创立江小白,凭营销身家上亿,为何最后销声匿迹高举人间一杯烟火的江小白,因为一句句引人共鸣的话语,迅速打开了市场。在喝酒就要喝陈年老酒的固有思维下,江小白剑走偏锋,关注年轻人对白酒的需求,凭借瓶身上一句句戳心的文案,江小白找到光刻机未来十年的模样?从2021年EUV光源大会谈起编者按本周六(2021年10月23日),一年一度的EUV光源大会线上召开。总结过往,EUV光源大会的的主题重点有两类未来35年商用光源的发展未来510年下一代光刻机光源的预研。20realme真我GT大师版系列是什么样的?看完这篇文章你就知道了再过两天,网友们一直关注的realme真我GT大师版系列就要正式发布了,随着时间的推移,realme真我手机官微也公布了许多关于realme真我GT大师探索版的信息配置。也正式因为隐秘的角落5G是如何覆盖地铁的?5G,已经悄然在编织起一张天罗地网,试图捕捉每一个5G手机的连接请求,为手机背后那些多姿多彩的灵魂打开世界的窗口,铺就展示自我的舞台。明媚的阳光下,高耸的铁塔上,硕大的AAU熠熠闪1588v2,是怎样实现时钟同步的?一什么是1588v2?对于无线通信来说,时钟同步至关重要,是基站正常工作的必要条件。如果同步有问题,轻则切换成功率降低,重则系统无法运行。从3G4G以来,随着连接基站和控制器,核心什么!用5G需要换SIM卡?自从去年5G正式商用以来,三大运营商一致宣称使用5G服务,可以不换卡不换号,哪怕继续用着4G套餐也没问题,只要有5G手机就行。然而,近日中国电信最新发布的中国电信5GSA安全增强S微信备用金2000开通入口微信备用金又称之为支付备用金,目前是邀机制开通,现在我们来看看怎么查看你的微信备用金入口。这个备用金可以为用户提供一个更多的支付机会,在用户有支付需求的时候可以直接使用这款软件进行从1994年开始,重新开始认识斯嘉丽约翰逊9岁到36岁明信片Vol。12如果你见识了她的清醇美丽,那么就不会忘记那个俏皮的鼻尖,闪动的眼神以及所有部位的具杀伤力的尤物。其实,喜欢她的所有人都并不只想她变成一个用身体对话的演员,因为她的备用金we2000额度你开通了吗?We2000是什么?We2000是腾讯微众银行新推出的围绕日常生活消费而设计的一款集账户存取消费支付积分权益等服务一体化的线上支付产品,用户可以将资金存入We2000账户,在微信支we2000支付备用金开通入口微信备用金又称之为支付备用金,目前是邀请机制开通,现在我们来看看怎么查看你的微信备用金入口。这个备用金可以为用户提供一个更多的支付机会,在用户有支付需求的时候可以直接使用这款软件进微信新技能备用金5000额度,教你怎么开通微信分付是全新的分期消费贷,开通后可在支付时选择使用,主打按日计息随借随还,由用户自行指定还款日,支持提前还款,提前还款任意金额无需手续费。但是只要使用了微信分付就有费用产生,不同