【问题标题】:The optimal way to find multiple needle in string [closed]在字符串中找到多个针的最佳方法[关闭]
【发布时间】:2025-12-07 09:35:01
【问题描述】:

我正在设计java 中的解析器,它可以在新闻文章中找到股票项目的名称。

文章的长度在 500 到 2000 字之间。库存商品近3000件。

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

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

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

谢谢。

【问题讨论】:

  • 后缀数组应该适合大数据,但我不确定你的情况是否足够大。

标签: java string algorithm search


【解决方案1】:

当所有字符串都是静态的时,后缀是一个不错的选择,也就是说你应该事先知道文章和项目的名称,它们不会改变。当文章不是静态的或者可能有很多文章要处理时,Trie 将是一个不错的选择。您可以根据库存项目的名称构建一个 Trie,然后枚举文章中的每个位置。考虑到您的输入大小,它的成本为 O(Len(article) * 项目名称的平均长度),它应该足够高效。

另外,您可以使用Aho–Corasick 算法来避免枚举文章中的每个位置,并且只需O(文章长度)即可找到文章中的所有库存项目。

【讨论】:

【解决方案2】:

如果我没听错,您想在较长的文本中查找子字符串。在 C# 中,您只需使用 Substring 之类的方法。不知道它们是否存在于java中。否则我会选择Boyer–Moore–Horspool algorithm 来搜索子字符串并在给定文本中获取它们的位置。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      在您的情况下,似乎可以将输入拆分为标记(单词),然后在非常有限的字典(库存项目)中执行查找。 如果您使用散列进行查找,您将需要计算单词的散列 + 散列本身的成本。假设一个完美的散列函数,这是 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)
      

      【讨论】: