百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从 这个输入 流中随机取得 m 个记录。
2013-08-26 16:06
1306 查看
在解决这个问题之前, 我们先看一下堆的定义(这里指的是数据结构中的堆)
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个记录就是随机的)
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个记录就是随机的)
相关文章推荐
- 33. 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入 流中随机取得m个记录
- 给定一个输入数据流,这个输入流很大,你不能将他们完全放在内存中。如何才能从这个输入流中随机的选取1000个数?
- 编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中: 假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次 读入一个字符,而且当您按下回车键时会产生换行符(/n)
- 编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中: 假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次 读入一个字符,而且当您按
- 谷歌面试题:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字) 。如何才能从这个无穷尽的流中随机的选取 1000 个关键字?
- 面试题:给定一个有序的数组,如果往该数组中存储一个元素,并保证这个数组还是有序的,那么元素的存储的角标位如何获取。
- 阿里巴巴面试算法题:有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N
- 今天看了一篇oracle tip,关于如何获得行锁时跳过已被锁的行,oracle8i的sql reference居然没有关于这个选项的介绍,特此记录下来。
- 开平方 如果没有计算器,我们如何求2的平方根? 可以先猜测一个数,比如1.5,然后用2除以这个数字。
- 面试题--给40亿个不重复的,没有排过序,给一个无符号整数,如何判断这个数在这40亿个数中
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的
- 谷歌面试题:输入是两个整数数组,他们任意两个数的和又可以组成一个数组,求这个和中前k个数怎么做?
- 有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机
- 例题:把一个超市购物的题做成函数。这个题做成函数没有必要,但可以了解输入参数,输出参数,返回值,函数体,还有结构体,ArryList集合,for循环算结果,以及集合里 .count的使用
- 开平方 如果没有计算器,我们如何求2的平方根? 可以先猜测一个数,比如1.5,然后用2除以这个数字。
- 自定义一个输入框点击搜索后可以保存记录,搜索有取消,只有输入文字后在出现
- Win7中如何在服务中启动一个当前用户的进程——函数CreateProcessAsUser()的一次使用记录
- 有2.5亿个整数存放在一个文件中,(已知内存容量没有此文件大)如何判断出这个文件中有多少个不相同的数。