weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
          數據加載中……

          位圖(bitmap)排序

          放假之前從圖書館借來《編程珠璣》,開篇便把我震住,作者以位圖排序優雅地解決了一個現實問題:
          有3000萬個沒有重復的電話號碼,1M內存,外存比較充裕,需要將這3000萬個電話排序
          借此作者引出了位圖排序:
          位圖排序是指以一個N位長的串,每位上以“1”或“0”表示需要排序的集合(后簡稱“集合”)中的數。比如集合為{2,7,4,9,1,10},則生成一個10位的串,將第2、7、4、9、1、10位置為“1”,其余位置為“0”,這樣當把串中所有位都置完后,排序也自動完成了(因為串的下標是有序的):1101001011
          位圖排序的代碼如下:

          public void bitmapSort(int[] set){
            
          int max=max(set);
            
          int[] array=new int[max];
            
            
          for(int i=0;i<array.length;i++)
              array[i]
          =0;

            
          for(int i=0;i<set.length;i++)
              array[
          set[i]]=1;

            
          for(int i=0;i<array.length;i++){
              
          if(array[i]==1)
                System.
          out.println(i+” ”);
            }

          }


          private int max(int[] set){
            
          // return the maxium integer of the set
          }


          可以看出,位圖排序的時間復雜度是O(n)的,比一般的排序都快,但它是以空間換時間(需要一個N位的串),而且有一些限制,比如排序前集合大小最好已知,而且集合中元素的最大重復次數必須已知,最好是稠集數據(不然空間浪費很大)。

          posted on 2005-10-28 15:25 weidagang2046 閱讀(641) 評論(0)  編輯  收藏 所屬分類: Others

          主站蜘蛛池模板: 黄骅市| 山阴县| 上蔡县| 都江堰市| 海淀区| 昌宁县| 拜泉县| 西平县| 武胜县| 文水县| 石台县| 五莲县| 荔浦县| 绥阳县| 镇远县| 莎车县| 林周县| 甘泉县| 岳阳市| 桃源县| 肇州县| 嫩江县| 宽甸| 金平| 惠来县| 青浦区| 会东县| 黎川县| 盐池县| 扶沟县| 白河县| 扎兰屯市| 和田县| 黄浦区| 色达县| 晋城| 桐乡市| 淄博市| 云龙县| 丰镇市| 突泉县|