我寻找更快的算法。 我试图验证字典中是否存在单词。
这是我在java中的代码。
public class Searcher {
public static void main(String[] args){
File file = new File("pathToFile");
Scanner scanner = null;
try{
scanner = new Scanner(file);
}catch(FileNotFoundException e){
System.err.println("Le fichier n'a pas ete trouve");
}
//Word to look for.
String word = "mot";
//indicator of word existence.
boolean nonExistence = true;
while(scanner.hasNext()){
if(Pattern.matches(word, scanner.next())){
System.out.println("\"" + word + "\"" + " est un mot francais.");
nonExistence = false;
break;
}
}
if(nonExistence){
System.out.println("\'" + word + "\'" + " n'est pas un mot francais.");
}
}
}
我想不必浏览整个文件。 感谢。
答案 0 :(得分:4)
我认为这取决于文件的大小。如果您正在执行许多搜索操作,并且可以将文件加载到RAM中并在那里执行搜索操作,那么我会想到一些想法。
第一个想法有点复杂,但实际上是一种强有力的搜索方式。您可以构建Trie Tree。这样,您的搜索复杂度将减少到您要搜索的单词的长度,而不是文件的大小。当您需要搜索现有单词,甚至将新单词添加到词典中时,此解决方案很有用,因为这两个操作都具有复杂度O( | WORD | ),其中 | WORD | < / strong>是您要添加/搜索的单词的长度。
另一种解决方案是按字典顺序将单词存储在数组中,并使用二进制搜索来查找要搜索的单词。当然,只有当您的搜索操作比添加新单词的操作频繁时,此解决方案才有用。搜索单词的复杂程度等于O( | LEN | * Log(N)),其中 | LEN | 是近似值字典中单个单词的长度, N 是字典中单词的数量。但是,添加一个新单词非常昂贵,因为您需要将其插入正确的位置,并对其后面的单词执行移位操作。
如果您的文件非常大并且将其加载到RAM不是一个选项,并且基于快速搜索(例如,检查this问题),我相信所有编程语言(包括Java)都不会。 t包含从文件中读取特定行的方法,顺序扫描是唯一的方法,这意味着您只能按照现在的方式顺序扫描文件,搜索单词。
答案 1 :(得分:1)
转到Coursera: Algorithms on Strings - Suffix Trees。这正是您正在寻找的东西。在那里你可以找到几个视频和幻灯片(它是免费的)。这些材料可以帮助您实现问题,然后您就可以轻松实现它。
以breaf方式:最有效的方法是构建Suffix Tree
文本,然后将您的模式与此Suffix Tree
匹配。
答案 2 :(得分:1)
嗯,实际上对我来说很简单。我没有尝试代码,但这是一个想法:
你不想找整个文件吗?但是你指定的这个词很清楚。无论什么是&#34; Look&#34; &#34;以&#34; &#34;获取&#34;我不知道什么;
为您的代码添加更多约束,获取单词的第一个字母,并在字典中仅搜索也以该字母开头的单词。 (Java有库和易于迭代)
例如,如果你的话是&#34; Take&#34;你可以说搜索索引之类的东西找到以&#34; t&#34;开头的单词。 (忽略这种情况)取决于你的字典。
有了这个,你不必寻找整个文件,它变得更快。