<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    最后整了個(gè)測試文件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 閱讀(3355) 評(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)論
      

    主站蜘蛛池模板: 国产亚洲视频在线播放| 波多野结衣免费视频观看| 国产中文字幕在线免费观看| 亚洲aⅴ无码专区在线观看| 91嫩草私人成人亚洲影院| 亚洲国产综合无码一区| 久久久久亚洲精品男人的天堂| 亚洲国产精品人人做人人爽 | 99久久免费国产香蕉麻豆| 久久久久久久久久国产精品免费| 99视频在线观看免费| 欧美好看的免费电影在线观看 | 毛片免费vip会员在线看| 亚洲免费综合色在线视频| 最新免费jlzzjlzz在线播放| 国产av无码专区亚洲av果冻传媒 | 72pao国产成视频永久免费| 成人免费观看男女羞羞视频| 国产成人不卡亚洲精品91| 美女被爆羞羞网站在免费观看| 91av免费在线视频| 女人让男人免费桶爽30分钟| 日韩特黄特色大片免费视频| 最好免费观看韩国+日本| 免费无码一区二区三区蜜桃大 | 最好2018中文免费视频| 久久WWW免费人成—看片| 久久精品一区二区免费看| 8x8x华人永久免费视频| 成年人免费的视频| 久久精品国产亚洲综合色| 精品亚洲成AV人在线观看| 亚洲不卡影院午夜在线观看| 亚洲一区二区三区高清在线观看 | 亚洲成AⅤ人影院在线观看| 亚洲ts人妖网站| 亚洲av永久无码精品网址| 4399好看日本在线电影免费| 亚洲国产精品高清久久久| 男女污污污超污视频免费在线看| 成人免费毛片内射美女APP|