【问题标题】:Performance of Occurences of Substring in String字符串中子串出现的表现
【发布时间】:2011-04-04 17:16:37
【问题描述】:

我遇到了在另一个字符串中查找所有出现的子字符串的任务,并且想知道解决这个问题的最佳算法是什么。

出于演示目的,我使用了字符串“The cat sat on the mat”并搜索所有出现的子字符串“at”。这最终应该导致出现次数为 3。由于我现在正在使用 java 编程,所以我首先想到的是:

    public static void main(String[] args) {

      int count=0;
      String s = "The cat sat on the mat";

      Pattern pattern = Pattern.compile("at");
      Matcher matcher = pattern.matcher(s);
      while(matcher.find()){
          count++;
      }

      System.out.println("Pattern: "+pattern+" Count: "+count);
    }

不知何故,我怀疑这是解决此问题的最佳解决方案。因此,如果有人知道最佳(或至少相当不错)解决方案的外观......请回答!你可以用任何语言发布你的答案,不一定是java(虽然那会很棒:))。

非常感谢!

【问题讨论】:

  • 在某种程度上取决于搜索字符串的长度与搜索字符串的长度、字母的大小以及您将执行的搜索次数。
  • 但是,如果您还没有测量性能问题,请不要担心......

标签: algorithm performance string search


【解决方案1】:

有一些令人印象深刻的子字符串算法。通常会提到 Boyer-Moore 算法 (http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm),但也有其他替代方案,例如 http://en.wikipedia.org/wiki/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithmhttp://en.wikipedia.org/wiki/Rabin-karp

【讨论】:

  • 博耶-摩尔+1。顺便说一句,互联网上有一些关于 BM 的嗡嗡声(也许是 Reddit),找不到链接。但是谷歌它,你应该看到一些关于它的动画讨论。非常有用。
【解决方案2】:

没有正则表达式的开销:

public static void main(String[] args) {

    int count = 0;
    String s = "The cat sat on the mat";
    String substring = "at";

    int pos = s.indexOf(substring);
    while (pos > -1) {
        count++;
        pos = s.indexOf(substring, pos + 1);
    }

    System.out.println("Pattern: "+pattern+" Count: "+count);
}

我在 Wikipedia 上的 Boyer–Moore string search algorithm 文章的文本中搜索“at”进行了快速测试。他们都找到了相同数量的匹配项,但是在我的机器上执行 10.000 次,正则表达式算法花费了 1702 毫秒,而这只是 192 毫秒!

【讨论】:

    【解决方案3】:

    像往常一样,这取决于。

    理论上最好的方法可能是使用后缀树——但它们只有在非常大的字符串上才开始有意义。后缀数组稍微难以使用,但对较小的字符串有意义。 IIRC,zlib deflate 算法使用后缀数组来查找重复的子字符串。无论哪种情况,算法都不是简单明了的,需要大量研究才能理解和有效实施。

    如果您只是担心程序员的工作效率和易于理解的代码,我想您编写的内容很难超越。假设一个相当智能的正则表达式解析器,它对于正常使用可能足够快。

    【讨论】:

      猜你喜欢
      • 2010-10-20
      • 1970-01-01
      • 2021-02-10
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多