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

 

编程珠玑的开篇就是讲了如何对大数据量的数据进行排序问题 - 比如 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....

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值