所以ArrayList“comb”包含长度相等的字符串和某些字符的变体。在最坏的情况下,这个列表可以包含大约100,000个字。函数checkWord(String str)将一个单词作为参数,并检查该单词是否存在于Hashtable字典中(其中包含另外90,000个字,文本文件已读入此散列表)。所以基本上,代码需要检查List“comb”中的哪些单词出现在HashTable“dictionary”中。在最坏的情况下,这个搜索需要花费5分钟。我想实现Runnable并将其并行化,但不确定如何去做。如何正确实现Runnable在Hashtable中搜索元素?
例如:列表梳包含CURMUDGEON的各种拼写错误和正确的单词本身。该列表包含98415个。 CURMUEGEON CURMUEGEOH CURMUEGEOJ CURMUEGEKN等等。因此,检查这些单词是否存在于哈希表中需要200秒。我想打倒这个时候
class key implements Runnable{
public static ArrayList<String> comb;
public static Hashtable<String,String> dictionary;
public static void main(String[] args) throws IOException{
key obj = new key();
Thread thread1 = new Thread(obj);
thread1.start();
}
public static Boolean checkWord(String str){
String toCheck = str.toLowerCase();
if(dictionary.contains(toCheck)){
return true;
}
else
return false;
}
public void run(){
for(String x:comb)
if (checkWord(x))
filtered.add(x);
}
在HashMap中查找100,000个单词应该是秒的顺序,如果是这样的话。做多线程是没有意义的。你确定'dictionary'确实是一个基于散列表的数据结构吗?请提供[mcve]。 –
@JonSkeet谢谢你,我编辑和更新了我的问题。 – daipayan
嗯...... 1)为什么这是一个'Map'而不是'Set'?什么是Map的值? 2)并行化的代价是复杂性。如果这些值是不相关的,我们对[set intersection]有更好的算法(http://stackoverflow.com/questions/4642172/computing-set-intersection-in-linear-time)。 – dhke