2024年安卓最全面对海量的数据,我们应该如何处理?(1),app启动界面设计

总结

我最近从朋友那里收集到了2020-2021BAT 面试真题解析,内容很多也很系统,包含了很多内容:Android 基础、Java 基础、Android 源码相关分析、常见的一些原理性问题等等,可以很好地帮助大家深刻理解Android相关知识点的原理以及面试相关知识

这份资料把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节;还有 高级架构技术进阶脑图 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

这里也分享给广大面试同胞们,希望每位程序猿们都能面试成功~

Android 基础知识点

Java 基础知识点

Android 源码相关分析

常见的一些原理性问题

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2020面试真题解析

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

三、面试问题解决

1、海量日志数据,提取出某日访问百度次数最多的那个IP。
算法思想: 分而治之+Hash

①.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理; ②.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日 志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;
③.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时 记录当前出现次数最多的那个IP地址;
④.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体 上出现次数最多的IP;

2丶搜索引擎会通过日志文件把用户每次检索使用的所有检索串 都记录下来,每个查询串的长度为1-255字节。假设目前有一千 万个记录(这些查询串的重复度比较高,虽然总数是1千万,但 如果除去重复后,不超过3百万个。一个查询串的重复度越高, 说明查询它的用户越多,也就是越热门。),请你统计最热门的 10个查询串,要求使用的内存不能超过1G。

可以在内存中处理,典型的Top K算法
算法思想: hashmap+堆

①.先对这批海量数据预处理,在O(N)的时间内用Hash表完成统计;
②.借助堆这个数据结构,找出Top K,时间复杂度为O(N*logK)。 或者:采用trie树,关键字域存该查询串出现的次数,没有出现为0。最后用10个元 素的最小推来对出现频率进行排序。

3、有一个1G大小的一个文件,里面每一行是一个词,词的大小 不超过16字节,内存限制大小是1M。返回频数最高的100个词。
算法思想: 分而治之 + hash统计 + 堆排序

①.顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文 件(记为x0,x1,…x4999)中。这样每个文件大概是200k左右。如果其中的有的文件 超过了1M大小,还可以按照类似的方法继续往下分,直到分解得到的小文件的大小 都不超过1M。
②.对每个小文件,采用trie树/hash_map等统计每个文件中出现的词以及相应的频 率。
③.取出出现频率最大的100个词(可以用含100个结点的最小堆)后,再把100个词 及相应的频率存入文件,这样又得到了5000个文件。最后就是把这5000个文件进 行归并(类似于归并排序)的过程了。

4、有10个文件,每个文件1G,每个文件的每一行存放的都是用 户的query,每个文件的query都可能重复。要求你按照query的 频度排序。

方案1:算法思想:分而治之 + hash统计 + 堆排序
顺序读取10个文件,按照hash(query)%10的结果将query写入到另外10个文件中。 这样新生成的文件每个的大小大约也1G,大于1G继续按照上述思路分。
找一台内存在2G左右的机器,依次对用hash_map(query, query_count)来统计每个 query出现的次数。利用快速/堆/归并排序按照出现次数进行排序。将排序好的 query和对应的query_cout输出到文件中。这样得到了10个排好序的文件(记 为)。
对这10个文件进行归并排序(内排序与外排序相结合)。

方案2: 算法思想:hashmap+堆
一般query的总量是有限的,只是重复的次数比较多而已,可能对于所有的query, 一次性就可以加入到内存了。这样,我们就可以采用trie树/hash_map等直接来统计 每个query出现的次数,然后按出现次数做快速/堆/归并排序就可以了。

5、 给定a、b两个文件,各存放50亿个url,每个url各占64字 节,内存限制是4G,让你找出a、b文件共同的url

方案1: 可以估计每个文件安的大小为5G×64=320G,远远大于内存限制的4G。所 以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。

算法思想: 分而治之 + hash统计

遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到 1000个小文件(记为a0,a1,…,a999)中。这样每个小文件的大约为300M。

遍历文件b,采取和a相同的方式将url分别存储到1000小文件(记为 b0,b1,…,b999)。这样处理后,所有可能相同的url都在对应的小文件 (a0vsb0,a1vsb1,…,a999vsb999)中,不对应的小文件不可能有相同的url。然后 我们只要求出1000对小文件中相同的url即可。

求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后 遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就 是共同的url,存到文件里面就可以了。

方案2: 如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示 340亿bit。将其中一个文件中的url使用Bloom filter映射为这340亿bit,然后挨个读 取另外一个文件的url,检查是否与Bloom filter,如果是,那么该url应该是共同的 url(注意会有一定的错误率)。

6、在2.5亿个整数中找出不重复的整数,注,内存不足以容纳这 2.5亿个整数。

采用2-Bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示多次, 11无意义)进行,共需内存2^32 * 2 bit=1 GB内存,还可以接受。然后扫描这2.5亿 个整数,查看Bitmap中相对应位,如果是00变01,01变10,10保持不变。所描完 事后,查看bitmap,把对应位是01的整数输出即可。

7、给40亿个不重复的unsigned int的整数,没排过序的,然后 再给一个数,如何快速判断这个数是否在那40亿个数当中?

方案1: 申请512M的内存,一个bit位代表一个unsigned int值。读入40亿个数,设 置相应的bit位,读入要查询的数,查看相应bit位是否为1,为1表示存在,为0表示 不存在。

方案2: 因为2^32为40亿多,所以给定一个数可能在,也可能不在其中;

这里我们把40亿个数中的每一个用32位的二进制来表示

假设这40亿个数开始放在一个文件中。

然后将这40亿个数分成两类:

1.最高位为0
2.最高位为1

并将这两类分别写入到两个文件中,其中一个文件中数的个数<=20亿,而另一个 >=20亿(这相当于折半了);

与要查找的数的最高位比较并接着进入相应的文件再查找

再然后把这个文件为又分成两类:

1.次最高位为0
2.次最高位为1

并将这两类分别写入到两个文件中,其中一个文件中数的个数<=10亿,而另一个 >=10亿(这相当于折半了);

与要查找的数的次最高位比较并接着进入相应的文件再查找。

… 以此类推,就可以找到了。
顺手留下GitHub链接,需要获取相关面试等内容的可以自己去找
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)

PDF和源码获取

重要知识点

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

高级进阶篇——高级UI,自定义View(部分展示)

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

  • 面试题部分合集

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

ps://bbs.csdn.net/topics/618156601)**

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值