给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中一32位整数。
1、在文件中至少存在这样一个数?
2、如果有足够的内存,如何处理?
3、如果内存不足,仅可以用文件来进行处理,如何处理?
答案:
1、如果采用位图思想来存放,则32位整数最多需要占用43亿个位。约512MB的内存空间。
如果某位上为1则存在这个数,为0则不存在这个数
int a[1+n/32];
void set(int i) {a[i>>32] |= (1<<(i&MASK));}
void clr(int i) {a[i>>32] &= ~(1<<(i&MASK));}
2.如果用二分搜索来解决此问题,算法如下
算法认为如果32位整数都存在的话则每个bit位上的0,1数量是相当的。
int split(int* a, int* b, int*c, int alen, int bit)
{
int biter, citer, i;//biter、citer分别是b和c的索引计数器
int v=0, re = 0, *t;
while(bit--){
v = (1 << bit); //v从最高位开始依次向后
for(i=biter=citer=0; i < alen; i++) { //遍历数组a
if(a[i] & (1<<bit)) {
b[biter++] = a[i];//若a[i]的第bit位为1,就把它存入b中
} else {
c[citer++] = a[i];//若a[i]的第bit位为0,则存入c中
}
}
if(biter <= citer) {//在遍历第bit位中,bit位为1的数比bit位为0的数少,那么缺失值肯定
//在bit位为1的中(在b中)
re += v; //所以将待求值第bit位置1
t = a;
a = b;
b = t; //我觉得这里将b给a就行了,没必要交换
alen = biter;
} else {
t = c; //若c数量少,则缺失值第bit为0,不用处理
c = a;
a = t; //将c赋给a,进行下一次迭代
alen = citer;
}
}
return re;
}
比如 abcdefgh
reverse(a,0,i-1); cba defgh
reverse(a,i, n-1); cba hgfed
reverse(a, 0, n-1); defgh abc
1、在文件中至少存在这样一个数?
2、如果有足够的内存,如何处理?
3、如果内存不足,仅可以用文件来进行处理,如何处理?
答案:
1、如果采用位图思想来存放,则32位整数最多需要占用43亿个位。约512MB的内存空间。
如果某位上为1则存在这个数,为0则不存在这个数
int a[1+n/32];
void set(int i) {a[i>>32] |= (1<<(i&MASK));}
void clr(int i) {a[i>>32] &= ~(1<<(i&MASK));}
2.如果用二分搜索来解决此问题,算法如下
算法认为如果32位整数都存在的话则每个bit位上的0,1数量是相当的。
int split(int* a, int* b, int*c, int alen, int bit)
{
int biter, citer, i;//biter、citer分别是b和c的索引计数器
int v=0, re = 0, *t;
while(bit--){
v = (1 << bit); //v从最高位开始依次向后
for(i=biter=citer=0; i < alen; i++) { //遍历数组a
if(a[i] & (1<<bit)) {
b[biter++] = a[i];//若a[i]的第bit位为1,就把它存入b中
} else {
c[citer++] = a[i];//若a[i]的第bit位为0,则存入c中
}
}
if(biter <= citer) {//在遍历第bit位中,bit位为1的数比bit位为0的数少,那么缺失值肯定
//在bit位为1的中(在b中)
re += v; //所以将待求值第bit位置1
t = a;
a = b;
b = t; //我觉得这里将b给a就行了,没必要交换
alen = biter;
} else {
t = c; //若c数量少,则缺失值第bit为0,不用处理
c = a;
a = t; //将c赋给a,进行下一次迭代
alen = citer;
}
}
return re;
}
2.字符串循环移位比如abcdef 左移三位,则变成defabc
求逆比如 abcdefgh
reverse(a,0,i-1); cba defgh
reverse(a,i, n-1); cba hgfed
reverse(a, 0, n-1); defgh abc