我们换一种方式,申请一个bit数组,数组大小为4294967295,大概为40亿bit,40亿/8 = 5亿字节,那么需要0.5G空间, bit数组的每个位置有两种状态0和1,那么怎么使用这个bit数组呢?呵呵,数组的长度刚好满足我们整数的个数范围,那么数组的每个下标值对应4294967295中的一个数,逐个遍历40亿个无符号数,例如,遇到20,则bitArray[20] = 1;遇到666,则bitArray[666] = 1,遍历完所有的数,将数组相应位置变为1。

4、40亿个非负整数中找到一个没有出现的数,内存限制10MB

​ 本题将内存空间缩小为10MB,对于40亿个数据来说那是明显不够用的,那么我们只有将数据分块处理,分块应该怎么分,分多少块合理呢?根据我做过的题经验来看,10亿个字节的数据大概需要1GB空间处理(如果这个结论不正确欢迎读者指出),那么10MB内存换算过来就是可以处理1千万字节的数据,也就是8千万bit,对于40亿非负整数如果申请bit数组的话,40亿bit / 0.8亿bit = 50,那么这样最少也得分50块来处理,处理每块数据的时候几乎用完了内存空间,这样也不太好。看书上解说是分成了64块,至于为什么是64我目前也不是很了解,我只知道最少50块。所以下面就以64块来进行分析解答吧。

首先,将0 - 4294967259这个范围平均分成64个区间,每个区间是67108864个数,为了定位更加准确一些,我们先开辟一个大小为64的整型数组intArray,将40亿个数进行区间划分,第0区间(0-67108863)、第一区间(67108864-134217728)、第i区间(67108864i-67108864(i+1)-1),…,第63区间(4227858432 - 4294967259)。intArray分别记录每个区间出现的数的个数,肯定至少有一个区间上的计数少于67108864.利用这一点可以快速找出一个没有出现过的数。

​ 第一次遍历时,先申请长度为64的整型数组countArr[0…63],countArr[i]用来统计区间i 上的数有多少。遍历40亿个数,根据当前数是多少来决定哪一个区间上的计数增加。例如,如果当前数是3422552090,3422552090/67108864=51,所以第51区间上的计数增加countArr[51]++。遍历完40亿个数之后,遍历countArr,必然会有某一个位置上的值(countArr[i])小于67108864,表示第i 区间上至少有一个数没出现过。我们肯定会至少找到一个这样的区间。此时使用的内存就是countArr的大小(64×4B),是非常小的。

假设我们找到第37区间上的计数小于67108864,以下为第二次遍历的过程:

1.申请长度为67108864的bit map,这占用大约8MB的空间,记为bitArr[0…67108863];

2.再遍历一次40亿个数,此时的遍历只关注落在第37区间上的数,记为num(num/67108864==37),其他区间的数全部忽略。

3.如果步骤2的num在第37区间上,将bitArr[num - 67108864*37]的值设置为1,也就是只做第37区间上的数的bitArr映射。

4.遍历完40亿个数之后,在bitArr上必然存在没被设置成1的位置,假设第i 个位置上的值没设置成1,那么67108864×37+i 这个数就是一个没出现过的数。

总结一下进阶的解法:

1.根据10MB的内存限制,确定统计区间的大小,就是第二次遍历时的bitArr大小。

2.利用区间计数的方式,找到那个计数不足的区间,这个区间上肯定有没出现的数。

3.对这个区间上的数做bit map映射,再遍历bit map,找到一个没出现的数即可。

5、找到100亿个URL中重复的URL

白嫖资料

​ 原问题的解法使用解决大数据问题的一种常规方法:把大文件通过哈希函数分配到机器,或者通过哈希函数把大文件拆成小文件。一直进行这种划分,直到划分的结果满足资源限制的要求。首先,你要向面试官询问在资源上的限制有哪些,包括内存、计算时间等要求。在明确了限制要求之后,可以将每条URL通过哈希函数分配到若干机器或者拆分成若干小文件,这里的“若干”由具体的资源限制来计算出精确的数量。

​ 例如,将100亿字节的大文件通过哈希函数分配到100台机器上,然后每一台机器分别统计分给自己的URL中是否有重复的URL,**同时哈希函数的性质决定了同一条URL不可能分给不同的机器;**或者在单机上将大文件通过哈希函数拆成1000个小文件,对每一个小文件再利用哈希表遍历,找出重复的URL;或者在分给机器或拆完文件之后,进行排序,排序过后再看是否有重复的URL出现。总之,牢记一点,很多大数据问题都离不开分流,要么是哈希函数把大文件的内容分配给不同的机器,要么是哈希函数把大文件拆成小文件,然后处理每一个小数量的集合。

6、海量搜索词汇,找到最热TOP100词汇的方法

​ 最开始还是用哈希分流的思路来处理,把包含百亿数据量的词汇文件分流到不同的机器上,具体多少台机器由面试官规定或者由更多的限制来决定。对每一台机器来说,如果分到的数据量依然很大,比如,内存不够或其他问题,可以再用哈希函数把每台机器的分流文件拆成更小的文件处理。

​ 处理每一个小文件的时候,哈希表统计每种词及其词频,哈希表记录建立完成后,再遍历哈希表,遍历哈希表的过程中使用大小为100的小根堆来选出每一个小文件的top 100(整体未排序的top 100)。每一个小文件都有自己词频的小根堆(整体未排序的top 100),将小根堆里的词按照词频排序,就得到了每个小文件的排序后top 100。然后把各个小文件排序后的top 100进行外排序或者继续利用小根堆,就可以选出每台机器上的top 100。不同机器之间的top100再进行外排序或者继续利用小根堆,最终求出整个百亿数据量中的top 100。对于top K 的问题,除哈希函数分流和用哈希表做词频统计之外,还经常用堆结构和外排序的手段进行处理。

7、40亿个无符号整数,1GB内存,找到所有出现两次的数

​ 对于原问题,可以用bit map的方式来表示数出现的情况。具体地说,是申请一个长度为4294967295×2的bit类型的数组bitArr,用2个位置表示一个数出现的词频,1B占用8个bit,所以长度为4294967295×2的bit类型的数组占用1GB空间。怎么使用这个bitArr数组呢?遍历这40亿个无符号数,如果初次遇到num,就把bitArr[num2 + 1]和bitArr[num2]设置为01,如果第二次遇到num,就把bitArr[num2+1]和bitArr[num2]设置为10,如果第三次遇到num,就把bitArr[num2+1]和bitArr[num2]设置为11。以后再遇到num,发现此时bitArr[num2+1]和bitArr[num2]已经被设置为11,就不再做任何设置。遍历完成后,再依次遍历bitArr,如果发现bitArr[i2+1]和bitArr[i2]设置为10,那么i 就是出现了两次的数。

白嫖资料

8、10MB内存,找到40亿整数的中位数

①内存够:内存够还慌什么啊,直接把100亿个全部排序了,你用冒泡都可以…然后找到中间那个就可以了。但是你以为面试官会给你内存??

②内存不够:题目说是整数,我们认为是带符号的int,所以4字节,占32位。

假设100亿个数字保存在一个大文件中,依次读一部分文件到内存(不超过内存的限制),将每个数字用二进制表示,比较二进制的最高位(第32位,符号位,0是正,1是负),如果数字的最高位为0,则将这个数字写入 file_0文件中;如果最高位为 1,则将该数字写入file_1文件中。

从而将100亿个数字分成了两个文件,假设 file_0文件中有 60亿 个数字,file_1文件中有 40亿 个数字。那么中位数就在 file_0 文件中,并且是 file_0 文件中所有数字排序之后的第 10亿 个数字。(file_1中的数都是负数,file_0中的数都是正数,也即这里一共只有40亿个负数,那么排序之后的第50亿个数一定位于file_0中)

现在,我们只需要处理 file_0 文件了(不需要再考虑file_1文件)。对于 file_0 文件,同样采取上面的措施处理:将file_0文件依次读一部分到内存(不超内存限制),将每个数字用二进制表示,比较二进制的 次高位(第31位),如果数字的次高位为0,写入file_0_0文件中;如果次高位为1,写入file_0_1文件 中。

现假设 file_0_0文件中有30亿个数字,file_0_1中也有30亿个数字,则中位数就是:file_0_0文件中的数字从小到大排序之后的第10亿个数字。

抛弃file_0_1文件,继续对 file_0_0文件 根据 次次高位(第30位) 划分,假设此次划分的两个文件为:file_0_0_0中有5亿个数字,file_0_0_1中有25亿个数字,那么中位数就是 file_0_0_1文件中的所有数字排序之后的 第 5亿 个数。

按照上述思路,直到划分的文件可直接加载进内存时,就可以直接对数字进行快速排序,找出中位数了。

9、设计短域名系统,将长URL转化成短的URL.

(1)利用放号器,初始值为0,对于每一个短链接生成请求,都递增放号器的值,再将此值转换为62进制(a-zA-Z0-9),比如第一次请求时放号器的值为0,对应62进制为a,第二次请求时放号器的值为1,对应62进制为b,第10001次请求时放号器的值为10000,对应62进制为sBc。

(2)将短链接服务器域名与放号器的62进制值进行字符串连接,即为短链接的URL,比如:t.cn/sBc。

(3)重定向过程:生成短链接之后,需要存储短链接到长链接的映射关系,即sBc -> URL,浏览器访问短链接服务器时,根据URL Path取到原始的链接,然后进行302重定向。映射关系可使用K-V存储,比如Redis或Memcache。

白嫖资料

10、让你系统的设计一个高并发的架构,你会从哪几个方面考虑?

系统拆分

​ 将一个系统拆分为多个子系统,用 dubbo 来搞。然后每个系统连一个数据库, 这样本来就一个库,现在多个数据库,不也可以扛高并发么。

缓存

​ 缓存,必须得用缓存。大部分的高并发场景,都是读多写少,那你完全可以在数 据库和缓存里都写一份,然后读的时候大量走缓存不就得了。毕竟人家 redis 轻 轻松松单机几万的并发。所以你可以考虑考虑你的项目里,那些承载主要请求的 读场景,怎么用缓存来抗高并发。

MQ

​ MQ,必须得用 MQ。可能你还是会出现高并发写的场景,比如说一个业务操作 里要频繁搞数据库几十次,增删改增删改,疯了。那高并发绝对搞挂你的系统, 你要是用 redis 来承载写那肯定不行,人家是缓存,数据随时就被 LRU 了,数 据格式还无比简单,没有事务支持。所以该用 mysql 还得用 mysql 啊。那你 咋办?用 MQ 吧,大量的写请求灌入 MQ 里,排队慢慢玩儿,后边系统消费 后慢慢写,控制在 mysql 承载范围之内。所以你得考虑考虑你的项目里,那些 承载复杂写业务逻辑的场景里,如何用 MQ 来异步写,提升并发性。MQ 单机 抗几万并发也是 ok 的,这个之前还特意说过。

分库分表

​ 分库分表,可能到了最后数据库层面还是免不了抗高并发的要求,好吧,那么就 将一个数据库拆分为多个库,多个库来扛更高的并发;然后将一个表拆分为多个 表,每个表的数据量保持少一点,提高 sql 跑的性能。

读写分离

​ 读写分离,这个就是说大部分时候数据库可能也是读多写少,没必要所有请求都 集中在一个库上吧,可以搞个主从架构,主库写入,从库读取,搞一个读写分离。 读流量太多的时候,还可以加更多的从库。

ElasticSearch

​ Elasticsearch,简称 es。es 是分布式的,可以随便扩容,分布式天然就可以支 撑高并发,因为动不动就可以扩容加机器来扛更高的并发。那么一些比较简单的 查询、统计类的操作,可以考虑用 es 来承载,还有一些全文搜索类的操作,也 可以考虑用 es 来承载。

11、假设有这么一个场景,有一条新闻,新闻的评论量可能很大,如何设计评论的读和写

可以进行读写分离、加载到缓存

12、显示网站的用户在线数的解决思路

维护在线用户表

使用Redis统计

Java面试核心知识点笔记

其中囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。

Java中高级面试高频考点整理

更多Java进阶知识笔记文档分享,这些对于面试还是学习来说都是一份不错的学习资料

有需要的朋友可以戳这里即可免费领取

最后还分享Java进阶学习及面试必备的视频教学

190)]

更多Java进阶知识笔记文档分享,这些对于面试还是学习来说都是一份不错的学习资料

有需要的朋友可以戳这里即可免费领取

[外链图片转存中…(img-A4MrlWMF-1628152235192)]

最后还分享Java进阶学习及面试必备的视频教学

[外链图片转存中…(img-i1drtyhx-1628152235194)]

成为阿里P7移动架构师到底有多难?不是吧阿sir相关推荐

  1. 成为阿里P7移动架构师到底有多难?超全Android中高级面试复习大纲,完整版开放下载

    前言 面试:如果不准备充分的面试,完全是浪费时间,更是对自己的不负责. 文末会给大家分享下我整理的Android面试专题及答案其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了,这里所列 ...

  2. 成为阿里P7移动架构师到底有多难?我的阿里春招之路分享,知乎上转疯了!

    接触这一行也有很久了,从开始的实习到带团队,中间接触过很多人,前不久身边刚好有人去面试了阿里,抖音等这些公司还成功的面试上了,现在来分享一下面试前需要准备的知识点 很多人去面试之前,不知道会问到那些知 ...

  3. 成为阿里P7移动架构师到底有多难?享学课堂java架构师

    基础知识 RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,它是使用Erlang语言来编写的,并且是基于AMQP协议的: RabbitMQ高性能的原因 E ...

  4. 阿里P7架构师到底有多难?

    搜索"架构师"三个字,会自动出现几个高频问题: 1.架构师是做什么的? 2.架构师需要掌握哪些知识? 3.架构师和程序员的区别是什么? 江湖上对于架构师有着各种各样的传说,但架构师 ...

  5. 分享阿里p7前端架构师技能图谱

    RobinsonZhang:前端工程师&&职能主管,达摩兵网站主笔,达摩空间订阅号作者杭州@西南交通大学~~项目管理 爱分享,爱挑战,技术狂热,不断写作,前沿布道. 我们从小白到大师, ...

  6. 阿里P7 java架构师 springcloud、jvm、netty 、redis、数据结构、分布式高并发 视频 下载分享

    作为普通java码农,你是否因为日复一日地写着业务代码无法深入了解前沿技术而感到焦虑: 作为经验尚浅的架构负责人,你是否在为新项目如何做到高并发秒杀.熔断.限流而感到无所适从: 作为一个跳槽求职者,你 ...

  7. 入职阿里巴巴,成为年薪百万阿里P7高级架构师需要必备哪些技术栈

    阿里巴巴是大部分程序员梦想的大厂,进阿里也不是一件容易的事,这里分享一份阿里内部PPT.从零开始学架构视频资料,Java系统性核心知识体系助你备战阿里 研发篇部分截图一览,感谢大佬们的分享 算法篇部分 ...

  8. 阿里P7级别架构师教你HashMap的工作原理

    HashMap的工作原理是近年来常见的Java面试题.几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道Hashtable和HashMap之间的区别,那么为何这道面试题如此 ...

  9. 阿里java架构师+职级_阿里 P8 高级架构师年入100W+,到底什么水平?

    原标题:阿里 P8 高级架构师年入100W+,到底什么水平? 大家都知道,阿里P8高级技术专家,基本上是一线技术人能达到的最高职级,也是很多程序员追求的目标.达到年入百万的P8 Java高级架构师级别 ...

最新文章

  1. Win10 Wsl可以装mysql_WSL win10子系统linux-ubuntu 安装mysql root用户远程连接 开机启动mysql服务 用navicat连接登录...
  2. Perl通过WIN32 OLE来操作EXCEL
  3. mysql update锁_mysql中update语句的锁
  4. MySQL中述职类型的长度问题
  5. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序
  6. 史上超详细的flask_sqlalchemy连接mysql数据库
  7. 便宜的手机图传遥控模块
  8. python 复现AC自动机
  9. ECshop生态全面开放,城市合伙人招募火热启动
  10. 查找两个表中主键一样但其它字段数值不一样的记录
  11. 杂勘复Intrepid Geophysics GeoModeller 2016 v3.3.0 Win64 1CD质模建
  12. WebM文件格式标准
  13. 贝叶斯网络:故障诊断方法研究
  14. ubuntu正确安装显卡驱动的姿势
  15. iperf3的交叉编译
  16. 高一计算机课期中考试总结反思,高一期中考试总结反思
  17. linux 内核PCI驱动总结记录
  18. Fastjson漏洞修复参考
  19. n1服务器系统和小钢炮,教你N1小钢炮系统设置中其他一些应用和服务器的设置的相关方法教程...
  20. 主成分分析法怎么提取图片中的字_论文中做出CNS高逼格的主成分分析图教程

热门文章

  1. 启动boot项目报错:Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedd
  2. centos dhcp服务器文件,Centos8上搭建dhcp服务器
  3. 写给技术Leader的财务常识:看懂三张报表
  4. 可汗学院 计算机操作系统,khan academy电脑版
  5. 全国计算机软考证书全称,2021年上半年计算机软考证书成绩查询通知(附:学院成绩查询)...
  6. 高数——含有有理根式的函数极限
  7. 狗尾草邱楠:2018 AI硬件没有新鲜事 1
  8. 细数1款国内外贸开源商城系统和15款国外的英文开源商城系统
  9. 生产数据造假?别担心,MES系统轻松处理
  10. 掌门1对1微服务体系Solar第1弹:全链路灰度蓝绿发布智能化实践