33. 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入 流中随机取得m个记录
来源:互联网 发布:linux新建文件的命令是 编辑:程序博客网 时间:2024/05/01 01:47
题目:
有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入
流中随机取得m个记录
分析:
这题在soso面试的时候也见过,当时没有答出来。
现在也每想出好的办法。
网上看到一种方法:每次输入一个记录时,随机产生一个0到1之间的随机数,
用这些随机数维护一个大小为m的堆。但是这种方法是否是后面的输入的纪录被选取的概率要比前面要大,不太合适随即取的要求。
???后续完善。。。
继续完善,谢谢_chen_lin_ 提供的思路。
模拟数据流生成了1-1000000的整数序列,随机在里面抽取100个数。
实现如下:
#include<iostream>#include<stdlib.h>#include<stdio.h>#include<string.h>using namespace std;#define m 100#define max 1000000int getdata(FILE* fp)//生成数据流的样本数据{ int i = 1; if(fp != NULL) { while(i< max) { char tmp[100]; memset(tmp, 0, 100); if(i == max -1) sprintf(tmp, "%d", i++); else sprintf(tmp, "%d,", i++); cout << tmp << endl; fwrite(tmp, strlen(tmp), 1, fp); } } return -1;}int main(int argc, char* argv[]){ /* //生产数据流的语句 模拟 FILE* fp = fopen("1.txt", "wb"); getdata(fp); fclose(fp);*/ int i = 0; int a[m]; string l = ""; while(getline(cin, l)) { const char* p1 = l.c_str(); const char* p2 = NULL; char tmp[100]; while(*p1 != '\0') { p2 = p1; while(*p2 != ',' && *p2 != '\0') p2 ++; memset(tmp, 0, 100); strncpy(tmp, p1, p2-p1); int k = atoi(tmp); if(i < m) a[i] = k; else { //rand algritem int l = rand()%(i+1); if(l < m) a[l] = k; } i ++; if(*p2 != '\0') p2 ++; p1 = p2; } } if(i > m) { i = 0; cout << "rand m data:"; while(i < m) cout << a[i++] << ","; cout << endl; } else cout << "have no stream" << endl; return 0;}
输出结果:rand m data:214081,42675,910277,156113,549744,324942,296182,219732,318989,104930,698642,350230,862258,91276,667257,259708,599704,654231,511576,995314,656139,747846,886097,866713,330504,242010,147976,327057,386808,117999,478944,293433,203708,584959,502002,90630,809846,359830,25989,110210,514453,63067,467666,454933,28548,458088,461703,667961,466615,434741,54051,704393,216666,880643,615583,439624,620417,603399,830626,697033,914745,326997,74834,77412,487891,314260,139194,225634,162485,335521,911982,801962,766891,154600,819794,856387,427236,604588,265978,526451,994597,337788,674932,23974,292355,483701,671288,148098,96424,838102,301385,823148,742111,614669,353253,794833,681198,596458,611455,959873,
- 33. 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入 流中随机取得m个记录
- 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从 这个输入 流中随机取得 m 个记录。
- 从输入流中随机抽取m个元素
- 九章算法面试题17 从输入流中随机取记录
- 编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中: 假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次 读入一个字符,而且当您按下回车键时会产生换行符(/n)
- 编写一个程序读入一行输入,然后反向打印该行,您可以把输入存储在一个char数组中: 假定该行不超过255个字符。回忆一下,您可以使用具有%c说明符的scanf()从输入中一次 读入一个字符,而且当您按
- 面试题 输入两个很大的正数(用C字符串表示),输出它们的乘积,不考虑非法输入
- 百度地图的POI搜索中:是否可以只输入一个关键词,不输入城市,
- 15. Google面试题:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b
- 谷歌面试题:给定一个数据流,其中包含无穷尽的搜索关键字(比如,人们在谷歌搜索时不断输入的关键字) 。如何才能从这个无穷尽的流中随机的选取 1000 个关键字?
- 百度面试题--M个不同的奖牌,每次随机取一个,一共可以取N次,取到所有M个不同奖牌的概率
- 输入一个数组(M,N),只可以想右边下边走,从(1,1)到(M,N)经过的最大数字和
- 不存储数据流的前提下,从输入流中获得这 n 个等概率的随机数据
- 不存储数据流的前提下,从输入流中获得这 n 个等概率的随机数据
- APPIUMsend_keys输入太慢?用adb可以提升很大速度
- 设计一个程序,输入3个整数,将其按从大到小的顺序输出
- 设计一个程序,输入3个整数,将其按从大到小的顺序输出
- 一个中兴的面试题,输入两个数n和m,从数列1,2,3……n中随意取几个数,使其和等于m,要求将其中所有组合列出来编程求解(c语言递归函数分解法)
- 蚁群算法
- BCTF 百度杯网络安全大赛 题解
- oracle 递归查询 CONNECT BY、START WITH、CONNECT_BY_ROOT、CONNECT_BY_ISLEAF、SYS_CONNECT_BY_PATH
- uva 490
- ubuntu完美搭建git服务器
- 33. 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入 流中随机取得m个记录
- hibernate 实体映射
- js
- MySQL Server性能调优
- iOS 用http上传图片
- 算法实践-任务调度-最小惩罚算法-贪心算法
- android使用Base64 加密解密传递 对象
- 大话设计模式-模板模式(学习笔记)
- mysql 包含查询