E81086713E446D36F62B2AA2A3502B5EB155

          Java雜家

          雜七雜八。。。一家之言

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
          外部排序?qū)崿F(xiàn)使用堆來生成若干個(gè)順串,然后使用多路歸并算法來生成最終排序好的內(nèi)容。

          本來打算使用敗者樹,結(jié)果發(fā)現(xiàn)敗者樹當(dāng)參與的競(jìng)賽者相對(duì)較多的情況下,沒有全部完成就被空節(jié)點(diǎn)充滿了。
          這個(gè)按照它的嚴(yán)格算法,其實(shí)也是可以知道不能保證總是能排完的。天快亮了,才徹底放棄使用敗者樹。改成實(shí)現(xiàn)贏者樹,結(jié)果發(fā)現(xiàn)贏者樹能保證不出錯(cuò),實(shí)現(xiàn)竟也順手。

          最后整了個(gè)測(cè)試文件500M的隨機(jī)內(nèi)容,2~3分鐘排序完成了(應(yīng)該還可以優(yōu)化),感覺還行。

          代碼較多,最要考慮到以后可能要重用。

          package algorithms.extsort;

          import java.io.IOException;

          import algorithms.MinHeap;

          /**
           * 
          @author yovn
           *
           
          */
          public class ExternalSorter {
              
                  
              
              
          public void sort(int heapSize,RecordStore source,RunAcceptor mediator ,ResultAcceptor ra)throws IOException
              {
                  MinHeap
          <Record> heap=new MinHeap<Record>(Record.class,heapSize);
                  
          for(int i=0;i<heapSize;i++)
                  {
                      Record r
          =source.readNextRecord();
                      
          if(r.isNull())break;
                      heap.insert(r);
                  }
                  
                  Record readR
          =source.readNextRecord();
                  
          while(!readR.isNull()||!heap.isEmpty())
                  {
                  
                      Record curR
          =null;
                      
          //begin output one run
                      mediator.startNewRun();
                      
          while(!heap.isEmpty())
                      {
                          curR
          =heap.removeMin();
                      
                          mediator.acceptRecord(curR);
                          
                          
          if (!readR.isNull()) {
                              
          if (readR.compareTo(curR) < 0) {
                                  heap.addToTail(readR);
                              } 
          else
                                  heap.insert(readR);
                          }
                          readR
          =source.readNextRecord();
                          
                      }
                      
          //done one run
                      mediator.closeRun();
                      
                      
          //prepare for next run
                      heap.reverse();
                      
          while(!heap.isFull()&&!readR.isNull())
                      {
                          
                          heap.insert(readR);
                          readR
          =source.readNextRecord();
                          
                      }
                      
                      
                  }
                  RecordStore[] stores
          =mediator.getProductedStores();
          //        LoserTree  lt=new LoserTree(stores);
                  WinnerTree  lt=new WinnerTree(stores);
                  
                  Record least
          =lt.nextLeastRecord();
                  ra.start();
                  
          while(!least.isNull())
                  {
                      ra.acceptRecord(least);
                      least
          =lt.nextLeastRecord();
                  }
                  ra.end();
                  
                  
          for(int i=0;i<stores.length;i++)
                  {
                      stores[i].destroy();
                  }
              }
              
              
              
          public static void main(String[] args) throws IOException
              {
          //        RecordStore store=new MemRecordStore(60004,true);
          //        RunAcceptor mediator=new MemRunAcceptor();
          //        ResultAcceptor ra=new MemResultAcceptor();
                  ExternalSorter sorter=new ExternalSorter();
                      
                  RecordStore store
          =new FileRecordStore("test_sort.txt");
                  RunAcceptor mediator
          =new FileRunAcceptor("test_sort");
                  ResultAcceptor ra
          =new FileRecordStore("test_sorted.txt");
                  
                  
                  sorter.sort(
          70000, store, mediator, ra);
              }
              
          }

          其余的都打包在此!

          源碼

          posted on 2007-12-16 08:08 DoubleH 閱讀(3349) 評(píng)論(3)  編輯  收藏 所屬分類: Memorandum

          Feedback

          # re: 使用贏者樹的外部排序[未登錄] 2008-10-08 20:52 jason
          請(qǐng)問 這個(gè)排序怎么用?  回復(fù)  更多評(píng)論
            

          # re: 使用贏者樹的外部排序 2013-01-13 17:40 YorkTsai
          把源碼都下載下來,把項(xiàng)目導(dǎo)入Eclipse中,CreateFile(含有main方法)用來生成隨機(jī)數(shù)據(jù)到一個(gè)文件,大小達(dá)4GB;ExternalSorter(含有main方法)用來對(duì)前面生成的文件進(jìn)行外排序。@jason
            回復(fù)  更多評(píng)論
            

          # re: 使用贏者樹的外部排序 2013-01-13 17:41 YorkTsai
          拜讀完畢,寫的太棒了,很多細(xì)節(jié)處理的很妙啊。。  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 黄平县| 汉中市| 青龙| 扬州市| 习水县| 南丰县| 楚雄市| 许昌县| 大厂| 武乡县| 谷城县| 凤庆县| 镇坪县| 九龙县| 阳朔县| 福安市| 江西省| 漳州市| 长春市| 新邵县| 克东县| 玛沁县| 桓台县| 梨树县| 库尔勒市| 泗阳县| 中西区| 焦作市| 平安县| 巢湖市| 新和县| 兴山县| 疏勒县| 阜新市| 宾川县| 治多县| 洱源县| 通渭县| 凤山市| 河间市| 科技|