对磁盘文件排序问题
分析:输入,最多包含n个正整数的文件,每个数小于n,n=10^7,没有任何整数重复出现,没有其他数据与该整数关联。
输出,按升序排列的输入整数的列表。
约束,大约1MB内存空间可用,充足磁盘存储空间可用。运行允许时间最多几分钟,不需要优化。
设计:1MB大约有一百万个字节,如果每个号码用七个字节存,能存143000个,如果每个号码用32位2^4整数来表示,那就能250000个号码,对于一千万个说,可以遍历输入40趟完成排序。就是第一趟遍历中,我将0到249999之间的所有整数读入内存,并对最多有250000个整数排序,然后写到输出文件中。第二趟就是250000到499999之间的整数,以此进行,我们知道对内存中的排序来说,快速排序会非常高效,仅仅需要20行代码,程序拥有多期望的特性--不必考虑使用中间存储文件,不足之处就是要读取输入文件40次。
1.方法:输入文件一次读入,利用工作文件(磁盘)存储文件多次读写进行归并排序,一次输出文件。
2.方法:40趟算法读入输入文件多次,多趟排序,输出文件一次,中间不再使用中间文件。
3.方法:用位图或位向量表示集合,就是一个20位长字符串表示所有元素都小于20的简单非负整数集合,通过单个二进制位的两种状态的变化。 具体操作就是,1Mb有8百万的二进制位,加上2百万的稀疏位,来存储最多一千万个整数(特殊属性:不重复,不关联,输入数据限制在较小范围),先是初始化遍历,再是通过读入文件中的每个整数建立集合,将每个对应位置都置为1,最后检验每一位,位为一就输出对应整数,产生有序输出文件。
伪代码:for i=[0,n)
bit[i]=0;
for each i in the input file
bit[i]=1;
for i=[0,n)
if bit[i] == 1
write i on the output file
由此总结原理:正确的分析问题,就完成了问题的90%
位图数据结构,减少占用空间
多趟算法。多次执行一小步,达到最后目标
时间和空间折中与双赢。运行时间和程序占用空间的双赢,经验经常是:减少程序所需空间,相应运行时间也减少,因为单次需要处理的数据量变小,时间也变小,同时,少量数据就可以直接存在内存中,不需要磁盘,减少了磁盘的访问时间。
简单的设计。能使程序更可靠,安全,健壮,高效。
如何使用一个具有类库的语言实现排序:
c程序使用标准库函数qsort来排序,
int intcomp(int *x,int *y){//comp函数指定排序序列,x-y小到大,y-x大到小
return *x-*y;
}
int a[10000000];
//qsort(base,num,width,comp)用法,对于长为1000的数组排序(a[1000]),那么base=a,num=1000,width=sizeof(int),comp=排序intcomp();
int main(void){
int i,n=0;
while(scanf("%d",&a[n]) != EOF) //EOF end of file 文件结束,一般值为-1;
++n;//计算出输入长度
qsort(a,n,sizeof(int),intcomp);
for(;i<n;i++)
printf("%d\n",a[i]);
return 0;
}
c++程序使用标准库函数中的set容器完成相同排序任务:
//set容器,一种关联容器,就是通过键key来读取和修改元素,一个键只能对应一个元素,即不存在重复元素,而且insert添加元素后,自动排序。符合问题要求。获取元素,set容器不支持下标访问操作元素。可以使用count()函数查询元素是否存在,存在返回1,否则0,find()函数查询元素存在,返回元素迭代器,及其值,否则返回末端迭代器。
int mian(void){
Set<int> s;
int i;
Set<int>::Iterator j;
while(cin>>i)
s.insert(i);
for(j = s.begin();j!=s.end();++j)//这里用++j是因为s.begin()已经=j了,他和j++区别就是少循环一次,先加和后加的区别
cout << *j<<"\n";
return 0;
}
如何使用位逻辑运算(例如与,或,移位)来实现位向量:
遗留问题:归并排序,java垃圾回收机制 session问题
session是基于cookie实现的,在不使用tomcat等web容器的session,只使用cookie也可以实现自己的session,完成会话管理,性能更好,
以往在tomcat等容器,使用httpRequestSession来保存用户信息,好处在于使用自带session方便,不需要额外处理,坏处:性能不好,session占用的内存比较多。
建议使用cookie,在用户端保存key
话外体:one windows战略,一个团体主导开发所以windows,一个核心,让不同操作系统在各种硬件上运行,一个统一的跨平台Store,一个统一的开发平台,使用统一所有系统的API
Linux操作系统, 云计算,大数据,移动互联
java开发必知的五个jdk开发工具,java.exe javac.exe
javap.exe,一个java类反汇编程序,可以查看java编译器生成的字节码,是分析代码和jvm运行机制的一个好工具。
jvisualvm,一个java虚拟机监控和分析的工具,不会用。
jcmd,主要用来把诊断命令请求发送到Java JVM中,当JVM进程中没有jcmd参数列表时,jcmd就会立即运行。
jhat,用来解析和浏览堆文件。
了解地址:http://www.csdn.net/article/2014-11-20/2822750-5-JDK-Tools-Every-Java-Developer-Should-Know?reload=1
移动互联网大会,关键词,用户体验,全球化,移动互联,移动搜索
地上如果有9只兔子你要抓1只兔子的话,就死死盯住那个兔子,如果这个抓抓那个抓抓什么都没有抓到,想明白自己要什么有什么放弃什么的时候,对我们这样规模的企业机会并不多,你要解决的是未来的问题。
分析:输入,最多包含n个正整数的文件,每个数小于n,n=10^7,没有任何整数重复出现,没有其他数据与该整数关联。
输出,按升序排列的输入整数的列表。
约束,大约1MB内存空间可用,充足磁盘存储空间可用。运行允许时间最多几分钟,不需要优化。
设计:1MB大约有一百万个字节,如果每个号码用七个字节存,能存143000个,如果每个号码用32位2^4整数来表示,那就能250000个号码,对于一千万个说,可以遍历输入40趟完成排序。就是第一趟遍历中,我将0到249999之间的所有整数读入内存,并对最多有250000个整数排序,然后写到输出文件中。第二趟就是250000到499999之间的整数,以此进行,我们知道对内存中的排序来说,快速排序会非常高效,仅仅需要20行代码,程序拥有多期望的特性--不必考虑使用中间存储文件,不足之处就是要读取输入文件40次。
1.方法:输入文件一次读入,利用工作文件(磁盘)存储文件多次读写进行归并排序,一次输出文件。
2.方法:40趟算法读入输入文件多次,多趟排序,输出文件一次,中间不再使用中间文件。
3.方法:用位图或位向量表示集合,就是一个20位长字符串表示所有元素都小于20的简单非负整数集合,通过单个二进制位的两种状态的变化。 具体操作就是,1Mb有8百万的二进制位,加上2百万的稀疏位,来存储最多一千万个整数(特殊属性:不重复,不关联,输入数据限制在较小范围),先是初始化遍历,再是通过读入文件中的每个整数建立集合,将每个对应位置都置为1,最后检验每一位,位为一就输出对应整数,产生有序输出文件。
伪代码:for i=[0,n)
bit[i]=0;
for each i in the input file
bit[i]=1;
for i=[0,n)
if bit[i] == 1
write i on the output file
由此总结原理:正确的分析问题,就完成了问题的90%
位图数据结构,减少占用空间
多趟算法。多次执行一小步,达到最后目标
时间和空间折中与双赢。运行时间和程序占用空间的双赢,经验经常是:减少程序所需空间,相应运行时间也减少,因为单次需要处理的数据量变小,时间也变小,同时,少量数据就可以直接存在内存中,不需要磁盘,减少了磁盘的访问时间。
简单的设计。能使程序更可靠,安全,健壮,高效。
如何使用一个具有类库的语言实现排序:
c程序使用标准库函数qsort来排序,
int intcomp(int *x,int *y){//comp函数指定排序序列,x-y小到大,y-x大到小
return *x-*y;
}
int a[10000000];
//qsort(base,num,width,comp)用法,对于长为1000的数组排序(a[1000]),那么base=a,num=1000,width=sizeof(int),comp=排序intcomp();
int main(void){
int i,n=0;
while(scanf("%d",&a[n]) != EOF) //EOF end of file 文件结束,一般值为-1;
++n;//计算出输入长度
qsort(a,n,sizeof(int),intcomp);
for(;i<n;i++)
printf("%d\n",a[i]);
return 0;
}
c++程序使用标准库函数中的set容器完成相同排序任务:
//set容器,一种关联容器,就是通过键key来读取和修改元素,一个键只能对应一个元素,即不存在重复元素,而且insert添加元素后,自动排序。符合问题要求。获取元素,set容器不支持下标访问操作元素。可以使用count()函数查询元素是否存在,存在返回1,否则0,find()函数查询元素存在,返回元素迭代器,及其值,否则返回末端迭代器。
int mian(void){
Set<int> s;
int i;
Set<int>::Iterator j;
while(cin>>i)
s.insert(i);
for(j = s.begin();j!=s.end();++j)//这里用++j是因为s.begin()已经=j了,他和j++区别就是少循环一次,先加和后加的区别
cout << *j<<"\n";
return 0;
}
如何使用位逻辑运算(例如与,或,移位)来实现位向量:
遗留问题:归并排序,java垃圾回收机制 session问题
session是基于cookie实现的,在不使用tomcat等web容器的session,只使用cookie也可以实现自己的session,完成会话管理,性能更好,
以往在tomcat等容器,使用httpRequestSession来保存用户信息,好处在于使用自带session方便,不需要额外处理,坏处:性能不好,session占用的内存比较多。
建议使用cookie,在用户端保存key
话外体:one windows战略,一个团体主导开发所以windows,一个核心,让不同操作系统在各种硬件上运行,一个统一的跨平台Store,一个统一的开发平台,使用统一所有系统的API
Linux操作系统, 云计算,大数据,移动互联
java开发必知的五个jdk开发工具,java.exe javac.exe
javap.exe,一个java类反汇编程序,可以查看java编译器生成的字节码,是分析代码和jvm运行机制的一个好工具。
jvisualvm,一个java虚拟机监控和分析的工具,不会用。
jcmd,主要用来把诊断命令请求发送到Java JVM中,当JVM进程中没有jcmd参数列表时,jcmd就会立即运行。
jhat,用来解析和浏览堆文件。
了解地址:http://www.csdn.net/article/2014-11-20/2822750-5-JDK-Tools-Every-Java-Developer-Should-Know?reload=1
移动互联网大会,关键词,用户体验,全球化,移动互联,移动搜索
地上如果有9只兔子你要抓1只兔子的话,就死死盯住那个兔子,如果这个抓抓那个抓抓什么都没有抓到,想明白自己要什么有什么放弃什么的时候,对我们这样规模的企业机会并不多,你要解决的是未来的问题。