【发布时间】:2016-08-18 00:38:10
【问题描述】:
我正在尝试用 Java 制作一个 Boggle 游戏,对于我的程序,一旦我将棋盘随机化,我就有一个方法可以遍历可能的组合并将每个组合与字典列表进行比较以检查它是否是一个有效的单词,如果是的话,我把它放在钥匙里。它工作正常,但是程序需要三到四分钟来生成密钥,这主要是由于字典的大小。我使用的那个有大约 19k 个单词,比较每个组合需要大量时间。这是我试图加快速度的部分代码:
if (str.length()>3&&!key.contains(str)&&prefixes.contains(str.substring(0,3))&&dictionary.contains(str)){
key.add(str);
}
其中str 是生成的组合。 prefixes 是我根据dictionary 生成的列表,如下所示:
public void buildPrefixes(){
for (String word:dictionary){
if(!prefixes.contains(word.substring(0,3))){
prefixes.add(word.substring(0,3));
}
}
}
它只是在字典中添加所有三个字母前缀,例如“abb”和“mar”,这样当str 像“xskfjh”一样乱码时,它不会被检查整个字典,只是prefixes这就像 1k 个单词。
我要做的是通过仅遍历字典中与str 具有相同首字母的单词来缩短时间,所以如果str 是“abbey”,那么它只会检查@ 987654331@ 反对以“a”而不是整个列表开头的单词,这将大大减少时间。甚至更好的是,它只检查str 与具有相同前缀的单词。我对 Java 很陌生,所以如果您的回答非常详细,我将不胜感激,谢谢!
【问题讨论】:
-
看起来你可能想要使用 Map
> 或类似的东西。这会将您的搜索分成 26 个块,并会在一定程度上加快搜索速度。但您可能正在寻找的是一种有效地构建和搜索图表的方法 -
谷歌搜索时发现了这个...wutka.com/dawg.html有趣的东西
-
你正在尝试重新发明 Trie
-
为什么不使用简单的
Set?我错过了什么吗?
标签: java performance arraylist