0

10 GB のファイルを 100000 + 数百語の複数のファイルに分割しています (100000 語に遭遇したときに行まで読んだため)。

private void splitInputFile(String path) {
    try{
        File file=new File(path);
        FileReader fr = new FileReader(file);
        BufferedReader br = new BufferedReader(fr);
        String temp;
        temp = br.readLine();
        String fileName="fileName";
        int fileCount = 1;
        while(temp!=null){
                //TODO Read 100000 words, sort and write to a file. Repeat for the entire file
            if(wordsToBeSorted.size()<=100000){
                startCounting(temp);
                temp=br.readLine();
            }//end of if ->  place 100000+ words inside the list
            else{
                Collections.sort(wordsToBeSorted);
                fileName = "fileName"+fileCount;
                fileCount++;
                File splitFile = new File(fileName);
                PrintWriter pr = new PrintWriter(splitFile);
                for(String word:wordsToBeSorted){   
                    pr.write(word);
                    pr.write("\n");//check if this works -> 1 word per line
                }//end of for
            }//end of else              
        }//end of while
        mergeSort(fileCount);
    }//end of try
    catch(Exception e){
        e.printStackTrace();
    }
}


private void startCounting(String sb) {
    StringTokenizer tokenizer = new StringTokenizer(sb);// Split by space
    while (tokenizer.hasMoreTokens()) {
        String text = tokenizer.nextToken();
        text = text.replaceAll("\\W", "");// Remove all symbols
        if("".equals(text.trim()))
            continue;
        wordsToBeSorted.add(text);
    }

}

今、これらのファイルをどのようにソートするのだろうかと思います。マージソートを実行する必要があることがわかりました。各 splitFile が可変数の単語 (100000 + いくつかの余分な単語) を持つという事実を考慮すると、可変単語数のファイルを含むマージソートを行うことは可能ですか? または、ファイルを分割する他の方法に従う必要がありますか?

4

1 に答える 1

1

可変ワード数のファイルを含むマージソートを行うことは可能ですか?

もちろん。ここでの目標は外部ソートだと思います。すべての入力ファイルを開いて (複数の実行が必要になる可能性がある非常に多くの . 次に、最小の単語で入力を識別し、それを出力に入れ、その入力から次の単語を読み取ります。入力がない場合を除き、空になった入力を閉じて削除します。

入力が多い場合は、ヒープを使用して入力を整理し、次の単語をキーにすることができます。最小限のオブジェクトを削除し、次の単語に進んだ後に再度挿入します。

于 2013-03-06T01:21:11.417 に答える