2017-02-16 61 views
1

所以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); 

     } 
+1

在HashMap中查找100,000个单词应该是秒的顺序,如果是这样的话。做多线程是没有意义的。你确定'dictionary'确实是一个基于散列表的数据结构吗?请提供[mcve]。 –

+0

@JonSkeet谢谢你,我编辑和更新了我的问题。 – daipayan

+2

嗯...... 1)为什么这是一个'Map'而不是'Set'?什么是Map的值? 2)并行化的代价是复杂性。如果这些值是不相关的,我们对[set intersection]有更好的算法(http://stackoverflow.com/questions/4642172/computing-set-intersection-in-linear-time)。 – dhke

回答

1

HashTable是一个传统的JDK1.0 API类,具有非常强大的并发保证。在particular,

与新的集合实现不同,Hashtable是同步的。

这意味着Hashtable上的每个操作都需要获得监视器锁定,这是反复查找的性能杀手。最好遵循JDK javadoc中给出的建议:

如果不需要线程安全的实现,建议使用HashMap代替Hashtable。如果需要线程安全的高度并行实现,则建议使用ConcurrentHashMap代替Hashtable。

0

为了使这个效率,您需要一个独立于梳名单的测试不同的范围,像

public class MySearcher implements Runnable { 
    ArrayList list; 
    int startIdx, endIdx; 
    public MySearcher(list, startIdx, endIdx) { 
    // copy into object fields 
    } 
    public void run() { 
    // test all values in the list between startIdx and endIdx 
    // put results into a data structure. Create a method to get/return that data structure 
    } 
} 

多的Runnable然后你可以使用一个ExecutorService所有您的Runnables(有关用法,请参阅javadoc:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html