我寻找一种更快的Java算法



我在寻找更快的算法。 我尝试验证字典中是否存在单词。

这是我在 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.");
}
}
}

我不想浏览整个文件。 谢谢。

我认为这取决于文件的大小。如果您正在执行许多搜索操作,并且可以将文件加载到 RAM 中并在那里执行搜索操作,那么我想到了以下几个想法。

第一个想法有点复杂,但确实是一种强大的搜索方式。你可以建立一个Trie树。这样,您的搜索复杂性将降低到您要搜索的单词的长度,而不是文件的大小。当您需要搜索现有单词,甚至将新单词添加到字典中时,此解决方案非常有用,因为这两个操作都具有复杂性 O(|WORD|),其中|字|是您添加/搜索的单词的长度。

另一种解决方案是按字典顺序将单词存储在数组中,并使用二叉搜索来查找您要搜索的单词。当然,仅当您的搜索操作比添加新单词的操作更频繁时,此解决方案才有用。搜索单词的复杂度等于 O(|精益|*日志(N)),其中|精益|是字典中单个单词的近似长度,N是字典中的单词数。但是,添加新单词非常昂贵,因为您需要将其插入正确的位置,并对其后面的单词执行移位操作。

如果您的文件非常大并且无法将其加载到 RAM,并且基于快速搜索(例如检查此问题),我相信所有编程语言(包括 java)都不包含从文件中读取特定行的方法,顺序扫描是唯一的方法这样做,这意味着您只能以与现在相同的方式按顺序扫描文件搜索您的单词。

转到 Coursera:字符串算法 - 后缀树。这正是您要寻找的。在那里您可以找到情侣视频和幻灯片(免费)。这些材料可以帮助您意识到问题,然后您将能够轻松实现它。

以一种轻率的方式:最有效的方法是构建文本的Suffix Tree,然后将您的模式与此Suffix Tree相匹配。

嗯,对我来说实际上看起来很简单。我没有尝试代码,但这是这个想法:

您不想查找整个文件吗?但是您指定的单词很清楚。无论什么是"看"拿

"得到"我不知道什么;向代码添加更多约束,以获取单词的第一个字母,并在字典中仅搜索也以该字母开头的单词。 (Java有库和简单的迭代)

例如,如果你的单词是"Take",你可以说像搜索索引这样的话,找到以"t"开头的单词(忽略大小写)取决于你的字典。

有了它,您不必查找整个文件,它变得更快。

最新更新