编程珠玑 第一章 问题以及分析解答

来源:互联网 发布:有拼豆图纸的软件 编辑:程序博客网 时间:2024/05/17 01:11

 

编程珠玑的开篇就是讲了如何对大数据量的数据进行排序问题 - 比如 1000w的数的排序问题(美国的电话号码)

作者给出了以下思路

1)合并排序 -

也就是将数据都进来之后

2)多输入排序

3)位图排序

问题如下:

1.如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合?

 

Answer: java.utils.Array 提供了对简单数据类型的排序方法 Sort

如: int arr[] = {0,1,2.... n}

Array.sort(arr);

 

 

2.如何使用位逻辑运算(例如与、或、移位)来实现位向量

  1. public class BitSet {  
  2.   
  3.     private int[] mBits;  
  4.     private int mSize;  
  5.       
  6.     /** 
  7.      * 初始化指定个bit 
  8.      * @param size 初始化的bit数目 
  9.      */  
  10.     public BitSet(int size) {  
  11.         mSize = size;  
  12.         initBits();  
  13.     }  
  14.       
  15.     /** 
  16.      * 将指定bit位置设为1 
  17.      * @param pos  
  18.      */  
  19.     public void set(int pos) {  
  20.         //得到此pos在数组中的索引  
  21.         int index = (int)Math.floor(pos/32f);  
  22.         //把当前整数的第n位设置为1  
  23.         mBits[index] = mBits[index] | (1<<(pos%32));  
  24.     }  
  25.       
  26.     /** 
  27.      * 获取指定位是否存在 
  28.      * @param pos 
  29.      * @return 
  30.      */  
  31.     public boolean get(int pos) {  
  32.         int index = (int)Math.floor(pos/32f);  
  33.         return mBits[index] == (mBits[index] | 1<<(pos%32));  
  34.     }  
  35.       
  36.     /** 
  37.      * 指定bit位置设为0 
  38.      * @param pos 
  39.      */  
  40.     public void reset(int pos) {  
  41.         int index = (int)Math.floor(pos/32f);  
  42.         //把当前整数的第n位设置为0  
  43.         mBits[index] = mBits[index] & ~(1<<(pos%32));  
  44.     }  
  45.       
  46.     /** 
  47.      * 初始化整型数组 
  48.      */  
  49.     private void initBits() {  
  50.         //Java中整型为32位,所以数组长度为位长度/32。  
  51.         int count = (int) Math.ceil(mSize/32f);  
  52.         mBits = new int[count];  
  53.         clear();  
  54.     }  
  55.       
  56.     /** 
  57.      * 清空,全部置零 
  58.      */  
  59.     private void clear() {  
  60.         int len = mBits.length;  
  61.         for(int index=0; index<len; index++) {  
  62.             mBits[index] = 0;  
  63.         }  
  64.     }  
  65. }

 

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....