在弦中找到多个针的最佳方法

时间:2014-11-10 06:49:00

标签: java string algorithm search

我正在设计 java中的解析器,它在新闻文章中找到了库存项目的名称。

文章的长度在500到2000字之间。库存商品的数量几乎是3000。

我认为这是在字符串问题中找到多个针。我想知道最好的算法或java库来解决这个问题。

我认为后缀数组可以是一个很好的解决方案。

如果您了解算法或一些提示,请告诉我。

谢谢。

4 个答案:

答案 0 :(得分:1)

当所有字符串都是静态的时,后缀是一个不错的选择,也就是说你应该提前知道文章和项目名称,并且它们不会发生变化。当文章不是静态的或者可能有很多文章需要处理时,Trie将是一个不错的选择。您可以根据库存项目的名称构建Trie,然后枚举文章中的每个位置。它花费了O(Len(文章)*项目名称的平均长度),根据您的输入大小,它应该足够有效。

此外,您可以使用Aho–Corasick算法来避免枚举文章中的每个位置,并且只需花费O(文章篇幅)来查找文章中的所有库存商品。

答案 1 :(得分:0)

如果我说得对,你想在更长的文本中找到子串。在C#中,您只需使用像Substring这样的方法。不知道它们是否存在于java中。否则,我会选择Boyer–Moore–Horspool algorithm来搜索子字符串并在给定文本中获取它们的位置。

答案 2 :(得分:0)

使用String Tokenizer然后循环并比较生成的所有令牌。

答案 3 :(得分:0)

在您的情况下,似乎可以将输入分为标记,单词,然后在非常有限的字典(库存项目)中执行查找。 如果使用散列进行查找,则需要为单词+散列本身计算散列的成本。假设一个完美的哈希函数,这是O(n),其中n是文章中的字符。

所以(简化)

  Set<String> items...

  String article = getArticle();

  Set<String> found = new HashSet<String>();

 for(String word : article.split(" ")) 
    if(items.contains(word)) 
       found.add(word)