目录
1、25 匹马,有一条只能 5 匹马比赛的赛道,我们无法计时,只能看到马的排名,如何用最短的次数找出跑的最快的 5 匹马?
3、海量数据如何求中位数?(数据无法放入内存,只需考虑空间复杂度,不需要考虑时间复杂度)
4、信息流采样,有 n 份数据,但是 n 的长度并不知道。设计一个采样算法,使得每份被选择的概率是相同的。
5、n 个 [0,n) 的数,求每个数的出现次数(不能开辟额外空间)
7、 已知有个 rand7() 的函数,返回 1 到 7 随机自然数,怎样利用这个 rand7() 构造 rand10(),随机 1~10。
1、25 匹马,有一条只能 5 匹马比赛的赛道,我们无法计时,只能看到马的排名,如何用最短的次数找出跑的最快的 5 匹马?
答案:最好的情况是 7 次,最坏的情况是 10 次。
首先建立一个表格,先把 25 匹马分为如下的五组:
每组进行比赛,假设第一组快慢顺序为 A1、A2、A3、A4 和 A5,第二组依次类推。那么各组的第一分别是 A1、B1、C1、D1、E1。
- 最好的情况:前五名是各组的第一名,例如[ A1、B1、C1、D1、E1 ]。
1)前5次比赛:让5个小组分别进行组内比赛。假设五次比赛结束后得到的各个小组的第一名是A1、B1、C1、D1、E1,这五个里面一定有一个是第一名。
2)第6次比赛:让[ A1、B1、C1、D1、E1 ]组间第一名比赛,得到总共的第一名。(假设 A1 是第一名,并且顺序是 A1 > B1 > C1 > D1 > E1)。
3)第7次比赛:已经得到第一名 A1,将距离 A1 最近的 A2 加入比较中,参与比赛的是[ B1、C1、D1、E1 、B2 ]。假设 B2 是这次比赛的最后一名,即比赛结果为 B1 > C1 > D1 > E1 > A2,那么剩下的也都比[ B1、C1、D1、E1 ]小,因此不用继续比赛,得到第二名至第五名。
- 最坏的情况:前五名不是各组的第一名,例如[ A1、A2、A3、A4、A5 ]。
1)前6次比赛相同与最好的情况相同,找出第一名A1。剩下各小组第一名[ B1、C1、D1、E1 ]。
2)第7次比赛,将 A2 计入比较中,[ B1、C1、D1、E1 、B2 ]进行比赛。假设 A2 是比赛的第一名,即比赛结果为 A2 > B1 > C1 > D1 > E1,那么 A2 就是第二名,剩下[ B1、C1、D1、E1 ]继续进行下面的比较。
3)第8、9、10次比赛,将 A3、A4 和 A5 依次加入比赛,这些数都比[ B1、C1、D1、E1 ]大,因此依次得到第三名第四名和第五名。
这个题更加常考的是问如何用最短的次数找出 25 匹马中最快的 3 匹马。
答案也是7次。前6次和找最快的5匹马一样,最后一次比赛不同。
1)前5次比赛:让5个小组分别进行组内比赛。假设五次比赛结束后得到的各个小组的第一名是A1、B1、C1、D1、E1,这五个里面一定有一个是第一名。
2)第6次比赛:让[ A1、B1、C1、D1、E1 ]组间第一名比赛,得到总共的第一名。(假设 A1 是第一名,并且顺序是 A1 > B1 > C1 > D1 > E1)。
3)第7次比赛:已经得到第一名,所以第二名一定产生在与第一名距离最近的之中。距离 A1 最近的是 A2 和 B1,他们中间会产生第二名。而距离这两个第二名候选的是 A3,B2,C1。因此让[ A2、B1、A3、B2、C1 ]进行比赛,这样就得到了第二名和第三名。