编程珠玑的开篇就是讲了如何对大数据量的数据进行排序问题 - 比如 1000w的数的排序问题(美国的电话号码)
作者给出了以下思路
1)合并排序 -
也就是将数据都进来之后
2)多输入排序
3)位图排序
问题如下:
1.如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合?
Answer: java.utils.Array 提供了对简单数据类型的排序方法 Sort
如: int arr[] = {0,1,2.... n}
Array.sort(arr);
2.如何使用位逻辑运算(例如与、或、移位)来实现位向量
- public class BitSet {
- private int [] mBits;
- private int mSize;
- /**
- * 初始化指定个bit
- * @param size 初始化的bit数目
- */
- public BitSet( int size) {
- mSize = size;
- initBits();
- }
- /**
- * 将指定bit位置设为1
- * @param pos
- */
- public void set( int pos) {
- //得到此pos在数组中的索引
- int index = ( int )Math.floor(pos/32f);
- //把当前整数的第n位设置为1
- mBits[index] = mBits[index] | (1 <<(pos% 32 ));
- }
- /**
- * 获取指定位是否存在
- * @param pos
- * @return
- */
- public boolean get( int pos) {
- int index = ( int )Math.floor(pos/32f);
- return mBits[index] == (mBits[index] | 1 <<(pos% 32 ));
- }
- /**
- * 指定bit位置设为0
- * @param pos
- */
- public void reset( int pos) {
- int index = ( int )Math.floor(pos/32f);
- //把当前整数的第n位设置为0
- mBits[index] = mBits[index] & ~(1 <<(pos% 32 ));
- }
- /**
- * 初始化整型数组
- */
- private void initBits() {
- //Java中整型为32位,所以数组长度为位长度/32。
- int count = ( int ) Math.ceil(mSize/32f);
- mBits = new int [count];
- clear();
- }
- /**
- * 清空,全部置零
- */
- private void clear() {
- int len = mBits.length;
- for ( int index= 0 ; index<len; index++) {
- mBits[index] = 0 ;
- }
- }
- }
3.如何生成一个包含K个整数的文件,要求这些整数都是唯一的,并且0到n-1中随机出现,次序也是随机的。
Answer:
这道题可以使用treap来生成-
1. 出现概率 -- 我们可以认为k个数的出现概率随机 - random(0,1)* ranmdom(0,1) -- 通过2次random,我们可以认为在10w这个量级上来说概率也随机了
2. 生成 K 个数 -- 我们将 0到 n-1 这n个数顺序读入,让后通过随机概率将这些数按照 Treap排列,即 P最大的那个数会成为 Root 节点,按照P成为一个堆,然后将其中前K个数字。
4.请在系统中用位图来实现并测试其运行速度。假设n=10000000,其中K=10000000;
Answer:
这道题可以使用上一篇博客的伪代码(具体实现稍后再作。)
6.如果某个整数出现的次数不是1次,而是10次,如何实现。
Answer: 之前的代码中,我们采用的是 1 bit 表示一个数,现在需要10次,可以将4个bit表示一个数,这样就可以通过这4个bit存储0 -15之内的所有次数。当然,最关键的就是 bit.set()和 bit.get()方法要重写。
7.程序缺陷 1) 如果重复,2)如果不是整数,3)如果是负数或者0,4)如果大于n,程序会如何处理?
Answer: 写程序要考虑的错误路径:) 这是写程序的最基本的考虑,你的代码是不是能正确的handle那些你不希望他出现的情况。嗯嗯,好好的改代码吧。
8. 美国有800,877,888这三个号段存储了免费号码,当然,这个号段还可能增加,请问如何才能1M的空间去排列所有的免费号码?
你如何存储一个免费号码集合以实施快速查找,从而确定给定的免费号码是可用还是已经被占用。
TBC....