摘要: 问题A题目:给定一个包含40亿个随机排列的顺序文件,找到一个不在文件中的32位整数,在有足够内存的情况下应该如何解决该问题?如果有几个外部的临时文件可用,但是仅有几百字节的内存,又该如何解决?(1)对于有足够内存的情况,完全可以采用位图存储的方法,详细内容看《编程珠玑》第一章。(2)Ed Reingold 给出了另外一种解法。 问题的关键是只要找到一个数字,那么我们把问题简化一下,给定一个文件,里头最多包含16个4bit的整数,找到一个不在文件中的4bit整数。假设这十个数是1 2 3 4 5 7 6 9 8 10。 取出一个数字,如果是最高位为1,放到一个文件中,否则放到另外一个文件中。.. 阅读全文
posted @ 2013-07-09 22:29 l851654152 阅读(391) 评论(0) 推荐(0) 编辑
摘要: 整个程序的思想就是: 1.每个整数有32位,那么它就可以表示32个数,分别对应每bit位为1. 2.然后把10000000个数分为1+N/BITSPERWORD组(相当于有这么多个桶),每组包含接近32个数。上面的解释可能仍不到位,那我们来看具体的函数:对于set函数,我们可以这样理解, arr[i>>SHIFT] |= (1#define BITPERWORD#define MASK 0x1F#define N 10000000#define SHIFT 5int a[N/BITPERWORD + 1];void clr_bit(int i){a[i>>SHIFT] 阅读全文
posted @ 2013-07-09 17:27 l851654152 阅读(205) 评论(0) 推荐(0) 编辑
摘要: http://www.codecho.com/reading-large-file-using-cpp/ 阅读全文
posted @ 2013-07-09 16:38 l851654152 阅读(149) 评论(0) 推荐(0) 编辑
摘要: scanf()函数的原理想象输入设备(键盘)连接着一个叫“缓冲”的东西,把缓冲认为是一个字符数组。当你的程序执行到scanf时,会从你的缓冲区读东西,如果缓冲区是空的,就阻塞住,等待你从键盘输入。现在假设你的缓冲区里有:abcd\n1234\n (其中\n是回车符)执行:scanf("%s",name);的时候,由于scanf是读数据直到看见空白符(空白符:指空格符、制表符、回车符)就停止的输入函数。所以执行后,把abcd存到了name中。缓冲区于是变成了 : \n1234\n接下来的执行就有问题了,如果遇到了:scanf("%d",&numbe 阅读全文
posted @ 2013-07-09 16:01 l851654152 阅读(553) 评论(0) 推荐(0) 编辑
摘要: 操作系统使用不同的值作为文件结束符。Windows上我们通过键入ctrl+z键作为文件结束符。Unix系统中,包括Mac OS-X机器,通常用ctrl+d作为文件结束符。用VC++6.0的时候,要输入两次ctrl+z及回车才能作为输入结束。 阅读全文
posted @ 2013-07-09 15:14 l851654152 阅读(540) 评论(0) 推荐(0) 编辑