私の実装は50ミリ秒未満で検索しています。
まず、ファイルを読み込んでメモリに保存しておく必要があります。
あなたはそれを読み込むことができますが、大きなチャンクで読み込んだ方が簡単です。
私の入力は、私が使用し、大きなファイルにリストを作成するには
(HTMLをダウンロードして、すべてのHTMLページのうち1つのファイルを作成します)byte into python book(HTML、単一のファイルのバージョンをダウンロードした)とJava language specificationましたこの同じプログラム(コメントされたコードを参照)。私はおよそ300K言葉で大きなファイルを持っていたら
は、私はこの出力を使用してプログラムを実行した:50ミリ秒の下で常に
C:\Users\oreyes\langs\java\search>dir singlelineInput.txt
El volumen de la unidad C no tiene etiqueta.
El número de serie del volumen es: 22A8-203B
Directorio de C:\Users\oreyes\langs\java\search
04/03/2011 09:37 p.m. 3,898,345 singlelineInput.txt
1 archivos 3,898,345 bytes
C:\Users\oreyes\langs\java\search>javac WordSearch.java
C:\Users\oreyes\langs\java\search>java WordSearch singlelineInput.txt "great"
Loaded 377381 words in 2844 ms
true
in 31 ms
C:\Users\oreyes\langs\java\search>java WordSearch singlelineInput.txt "great"
Loaded 377381 words in 2812 ms
true
in 31 ms
C:\Users\oreyes\langs\java\search>java WordSearch singlelineInput.txt "awesome"
Loaded 377381 words in 2813 ms
false
in 47 ms
C:\Users\oreyes\langs\java\search>gvim singlelineInput.txt
C:\Users\oreyes\langs\java\search>java WordSearch singlelineInput.txt "during"
Loaded 377381 words in 2813 ms
true
in 15 ms
C:\Users\oreyes\langs\java\search>java WordSearch singlelineInput.txt "specification"
Loaded 377381 words in 2875 ms
true
in 47 ms
C:\Users\oreyes\langs\java\search>java WordSearch singlelineInput.txt "<href"
Loaded 377381 words in 2844 ms
false
in 47 ms
C:\Users\oreyes\langs\java\search>java WordSearch singlelineInput.txt "<br>"
Loaded 377381 words in 2829 ms
true
in 15 ms
。
import java.io.*;
import java.util.*;
class WordSearch {
String inputFile;
List<String> words;
public WordSearch(String file) {
inputFile = file;
}
public void initialize() throws IOException {
long start = System.currentTimeMillis();
File file = new File(inputFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream((int) file.length());
FileInputStream in = new FileInputStream(file);
copyLarge(in, baos, (int)file.length());
Scanner scanner = new Scanner(new ByteArrayInputStream( baos.toByteArray()));
words = new LinkedList<String>();
while(scanner.hasNextLine()) {
String l = scanner.nextLine().trim();
//for(String s : l.split("\\s+")){
//System.out.println(s);
words.add(l.toLowerCase());
//}
}
Collections.sort(words);
for(String s : words) {
//System.out.println(s);
}
System.out.println("Loaded " + words.size() + " words in "+ (System.currentTimeMillis() - start) + " ms" );
}
public boolean contains(String aWord) {
return words.contains(aWord.toLowerCase());
}
// taken from: http://stackoverflow.com/questions/326390/how-to-create-a-java-string-from-the-contents-of-a-file/326413#326413
public static long copyLarge(InputStream input, OutputStream output, int size)
throws IOException {
byte[] buffer = new byte[size];// something biggie
long count = 0;
int n = 0;
while (-1 != (n = input.read(buffer))) {
output.write(buffer, 0, n);
count += n;
}
return count;
}
public static void main(String ... args) throws IOException {
WordSearch ws = new WordSearch(args[0]);
ws.initialize();
long start = System.currentTimeMillis();
System.out.println(ws.contains(args[1]));
System.out.println("in "+ (System.currentTimeMillis() - start) +" ms ");
}
}
難しい部分は、サンプル入力を取得することでした:
は、ここでは、コードですP
タブよりもインデントの方が、すべてのエディタ(SOの魔法のテキストエリアを含む)の方がより優れています。 –
個数はいくつありますか? –
長い単語のリストはどこから入手できますか?私は15kをシミュレートすることができ、私はmsの下で稼働しています – OscarRyz