![](/Editor/FCKeditor/editor/images/smiley/msn/thumbs_down.gif)
方法:bit 位操作
首先
32位机的寻址能力是 2的32次方, 即4G.寻址能力最大是这样了.
一个最大的9位整数为999999999
这9亿条数据是不重复的
声明一个bit数组,长度为10亿
一共需要10亿 / 8 / 1024 /1024 =120M
把内存中的数据全部初始化为0
读取文件中的数据,并将数据放入内存。比如读到一个数据为341245909这个数据,那就先在内存中找到341245909这个bit,并将bit值置为1
遍历整个bit数组,将bit为1的数组下标存入文件
然后再遍历一次,找出不为零的就可以了.
注意:
如果是有重复的数字,
需要考虑重复的情况
如果普遍多于2个,那么就要设置包含2个bit的数组
或者使用bitmap类型.
案例2
最快的方法找出一篇文章中各个字符的出现次数
声明数组int[256]
以该字符的aci码作为下标即可
案例3 全排列
a,b,c ,d, e 的所有排列
令a =1 ,b = 2,c = 3,...
那么从12345到54321的所有数打印出来就可以了
如果有别的限制,比如ac不相邻
那么就再转换成字符串判断好了.
案例4 组合
a b c d e 5个字母中选3个的组合
可以使用
a b c d e ----- 数组R(i)
a b c d e ------数组S(j)
a b c d e -------数组T(k)
模拟5进制的加法,R,S,T下标从0开始,然后T下标加一,加到5的话就让s下标加一
还有,既然是组合,就要保证s的下标从R的开始,T的从S的开始
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
案例5 把m个球分n组
0 1 2 ... m
...
0 1 2 ... m
总共n行
模拟M进制的加法即可
(其实和回溯法一个原理,只是这个更好理解)
案例6 换零钱问题
有足够的 1元,5元,10元,20元硬币
组合成170元有多少方法?
其实就是解方程
1 * x1 + 5 * x2 + 10 * x3 + 20 * x4 = 170
然后试解循环法解 x1,x2,x3,x4
案例6 一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数
:如果采用bit数组,40亿个bit也就120*4 = 480M 的空间,所以1G绰绰有余.
而40亿的整数占用的是480M * 32 = 15360M 即大约15G, 问题是怎样把这数字读进来
可以一个一个的读.
另外csdn上有个方法,不知道在这里有什么帮助,不过原理还是不错:
使用分段的方法:
因为4字节的整数可以用16进制表示为
00000000H 到 FFFFFFFFH
我们可以分成1000H为一段,把整数分割,
统计每个区间的占有情况
如果是1000H.那么统计不包含的数字就略过这个区间好了
但是这个前提还是要读进来吧?