Đây là triển khai của tôi, tìm kiếm dưới 50 mili giây.
Trước tiên, bạn phải tải tệp và giữ cho tệp được sắp xếp trong bộ nhớ.
Bạn có thể tải nó theo bất kỳ cách nào bạn muốn, nhưng nếu bạn tải nó theo khối lớn sẽ dễ dàng hơn.
đầu vào của tôi đã là byte into python book (tải về phiên bản tập tin duy nhất HTML) và Java language specification (tải về html và tạo ra một tập tin duy nhất trong số tất cả các trang html)
Để tạo danh sách vào một tập tin lớn tôi đã sử dụng chương trình tương tự này (xem mã nhận xét).
Khi tôi có một tập tin lớn với khoảng 300k từ, tôi chạy chương trình với sản lượng này:
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
Luôn dưới 50 ms.
Dưới đây là các mã:
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 ");
}
}
Phần cứng là để có được một mẫu đầu vào: P
Không gian chuyển tốt hơn trên tất cả các trình chỉnh sửa (bao gồm cả vùng văn bản ảo của SO) cho thụt lề so với tab. –
có bao nhiêu từ riêng biệt? –
Chúng ta có thể lấy danh sách từ dài ở đâu? Tôi quản lý để mô phỏng 15k và tôi đang chạy theo một ms – OscarRyz