jake1036

编程珠玑读书笔记(一)

 一 对一个外部文件的排序问题的巧妙解决
      
      1 问题的描述
         输入:
                      所输入的是一个文件,至多包含n个正整数,每个正整数都要小于n,如果一个正整数出现了一次以上,那么说明出错。

        输出:
                    以增序的方式输出的整数数列。

       约束 :
                   至多只有1M的内存空间,但是可用磁盘空间非常大,运行时间至多只允许几分钟。


 二 解决方案 

      输入文件 -------------精彩排序------------------输出文件 
      将数据一次性的全部倒入内存,我们才能获得最快的速度。 

     实现细节:
     用一个1000 万位的位图序列,来存储这些整数,在位序列中 第i为若为1 ,表示整数集中含有整数 i 。
    若为0则表示整数集中不包含 i 。定义该位图序列之后,我们将编码分为下面几个部分。
      
     (1) 首先清空该位图序列
           for(int i = 0 ; i < n ;i++)
              bitmap[i] = 0 ;
    (2) 从input 文件中读取每一个整数,将对应的在位图序列中的位置为1 
          while(i = read(file))
           {
                 bitmap[i] = 1 ;
           }
   (3) 输出位图序列阶段 
     
       for(int i = 0 ; i < n ; i++)
      {
         if(bitmap[i])
              printf("&d" , i) ;
     }
 输出序列即为最后的排序结果,很巧妙。   综上问题解决。 


三 感悟 
    
     1 问题精确地藐视 。
     2 位图数结构(在系统编程中常用,以后在编码中应该熟练使用) ,java和c++中都有 BitSet类。
     3 简单的设计,完美地解决了上面的问题。


  
  




  

    
   







      










          


   

posted on 2010-08-07 19:24 kahn 阅读(420) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理