《编程珠玑》上的一路题目,求问
《编程珠玑》上的一道题目,求问
就是第二章的第一个题目:
A:给定一个包含32位整数的顺序文件,它之多包含40亿个整数,并且没有排序。
请查找一个不在此文件中的32位整数。
1、如果内存足够,可以使用位图的方法,大约需要40亿/8字节的内存。这个方法没有疑问。
2、如果内存只有几百字节,但是有若干外部临时文件。此时如何解决?
那一节看完了,也没理解这个到底是怎么做的,求高手详细解释下。
还有,既然有若干外部存储,位图也可以从内存转移到外存吧,虽然这样可能要输入输出很多次。。。
------解决方案--------------------
仅供参考
就是第二章的第一个题目:
A:给定一个包含32位整数的顺序文件,它之多包含40亿个整数,并且没有排序。
请查找一个不在此文件中的32位整数。
1、如果内存足够,可以使用位图的方法,大约需要40亿/8字节的内存。这个方法没有疑问。
2、如果内存只有几百字节,但是有若干外部临时文件。此时如何解决?
那一节看完了,也没理解这个到底是怎么做的,求高手详细解释下。
还有,既然有若干外部存储,位图也可以从内存转移到外存吧,虽然这样可能要输入输出很多次。。。
------解决方案--------------------
仅供参考
//随机产生100000000个取值范围为[0~2的32次方减1]的数据,
//然后让用户输入一个数据,判断用户输入的数据是不是包含在前面随机产生的数据中。
//要求:当用户输入完成后,必须在1毫秒(千分之一秒)之内完成判断。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
long int i;
unsigned long ul;
unsigned long *d;
unsigned long ulrand(void) {
return (
(((unsigned long)rand()<<24)&0xFF000000ul)
------解决方案--------------------
(((unsigned long)rand()<<12)&0x00FFF000ul)
------解决方案--------------------
(((unsigned long)rand() )&0x00000FFFul));
}
void main() {
d=(unsigned long *)calloc(1<<(32-5),sizeof(unsigned long));
if (NULL==d) {
printf("Can not calloc(%d,%d)!\n",1<<(32-5),sizeof(unsigned long));
return;
}
srand(time(NULL));
for (i=0;i<100000000;i++) {
while (1) {
ul=ulrand();
if (0==(d[ul>>5]&(1lu<<(ul%32)))) {
d[ul>>5]
------解决方案--------------------
=1<<(ul%32);
break;
}
}
if (0==i%1000000) printf("%09d,%10lu\n",i,ul);
}
while (1) {
printf("\nInput a number:");
fflush(stdout);
rewind(stdin);
if (1==scanf("%lu",&ul)) break;
}
if (d[ul>>5]&(1<<(ul%32))) printf("Include.\n" );
else printf("Not include.\n");
free(d);