百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从 这个输入 流中随机取得 m 个记录。

2023-05-16

在解决这个问题之前, 我们先看一下堆的定义(这里指的是数据结构中的堆)


n个元素的序列{k1,k2,k3,k4,...kn}当且仅当满足下关系时,称之为堆

k(i)<=k(2i) 且 k(i)<=k(2i+1)   或者是 k(i)>=k(2i)且 k(i)>=k(2i+1)     (i=1,2,3,。。。,n/2).



好了言归正传,现在这里是一个很大的流按常理来说里面的记录数量应该大于m个,但是在这里为了考虑全面先假设 流里面的记录数小于m个,那么只需要将流里面的记录全部获取即可,当流里面的记录数量大于m个记录的时候,我们这样处理, 将每一个我们取出的记录通过一个随机算法得到一个随机数(当然随机数的范围大小的选取,与流中的记录数有关,如果记录很多的话那么范围就选大一点),首先用前m个记录的随机数建立一个大顶堆(小顶堆)也可以,然后依次读取后面的每一个记录然后计算得到随机数,然后将这个随机数加到堆里面去然后调整堆的结构是它满足堆的定义,这样当流全部读取完毕时,在内存中保存的是一个大小为M的堆。堆里面的记录就是问题所求,(这个问题妙的一点就是,任何一个记录的随机数都有被加入大顶堆的机会,所以这m个记录就是随机的)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从 这个输入 流中随机取得 m 个记录。 的相关文章

随机推荐