关于编程珠玑第2章的整理
2015-08-30 22:59
274 查看
给定一个最多包含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;
}
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
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
相关文章推荐
- 既然安卓免费,那 Google 是靠什么赚钱的?
- Lua直接调用动态链接库(DLL或so文件)
- java界面设计(swing)
- 逻辑运算符
- C++ MyString类的简单实现
- 【J2SE视频】-JDK安装
- 检查密码复杂度的C#正则表达式
- C++ 抽象类
- multiprocessing在python中的高级应用-托管对象
- java中的单例模式
- python 小细节(01)
- 06---Java基础、面向对象
- java基础 数组的增添改查
- delphi声明类及其调用方法
- C#基础------File类操作文件
- springMVC学习笔记(二)-----注解和非注解入门小程序
- c/c++可变宏定义
- 探索Java反射机制
- 1031. 查验身份证(15)
- Java依赖注入库框架 Dagger的源码分析(一)