字节跳动后端青训营
DAY4
一、【单选】go test 默认是以什么顺序执行测试的?
a. 多个 module 并发执行,单 module 下多个测试并发执行 b. 多个 module 并发执行,单 module 下多个测试串行执行 c. 多个 module 串行执行,单 module 下多个测试并发执行 d. 多个 module 串行执行,单 module 下多个测试串行执行
- 答案 & 解析 多个 modules 会并发编译,然后并发执行测试,除非添加了额外的参数-p=1。单个 modules 下多个测试会串行执行,除非在测试函数内执行t.Parallel()。
二、【分布式文件处理,获取最多的 URL】如果有一个 20g 的日志文件,日志文件记录着用户访问过的 url,每一行为一个 url,给你一台 512M 的主机,找出出现次数最多的 10 个 url。
- 解析 Top K算法:使用堆排序算法+大顶堆+10 个元素的数组。
IP 地址最多有 2^32=4G 种取值情况,所以不能完全加载到内存中处理; 可以考虑采用“分而治之”的思想,按照 IP 地址的 Hash(IP)%1024 值,把海量 IP 日志分别存储到 1024 个小文件中。这样,每个小文件最多包含 4MB 个 IP 地址; 对于每一个小文件,可以构建一个 IP 为 key,出现次数为 value 的 Hash map,同时记录当前出现次数最多的那个 IP 地址; 可以得到 1024 个小文件中的出现次数最多的 IP,再依据常规的排序算法得到总体上出现次数最多的 IP;