这种暴力算法NP难吗?

时间:2014-10-09 07:43:44

标签: java string algorithm time-complexity np

这是我们在项目管理系统中用于从摘要中提取关键字的强力算法。这种强力算法的时间复杂度是多少?它是NP-hard,NP-complete,NP还是P?

这是算法:

public static int search(String pattern, String text) {
  int M = pattern.length();
  int N = text.length();
  for (int i = 0; i < N - M; i++) {
    int j;
    for (j = 0; j < M; j++) {
      if (text.charAt(i+j) != pattern.charAt(j)) {
         break;
      }
    }
    if (j == M) {
      return i;
    }
  }
  return -1;
}

1 个答案:

答案 0 :(得分:0)

首先,只有问题可以在 NP ,或 NP -hard,或 NP - 完成,或者 P ,因此询问您的特定算法是 NP -hard还是 NP -complete是没有意义的。

您拥有的特定算法是天真的字符串搜索算法。给定长度为m的文本字符串和长度为n的模式字符串,它在时间O((m-n + 1)n)中运行。这是输入字符串大小的多项式,因此这个问题 - 字符串搜索问题 - 属于类 P 。它也在 NP ,因为 P 中的每个问题都在 NP 中,但不知道该问题是 NP -hard或 NP -complete,因为解决该问题将决定 P = NP

有理由问,当你发现自己暴力破解时,你的解决方案是否太慢,或者你试图解决的问题是否可以更有效地解决,为此,查找问题和看看它的知名度。在你的情况下,有更好的字符串搜索算法; Knuth-Morris-Pratt算法在最坏情况下运行时间O(m + n),Rabin-Karp算法平均在时间O(m + n)运行并且非常容易实现,而Boyer-Moore算法可以在许多情况下,在次线性时间运行。但是,您的强力算法不如这些算法有效,这与 NP - 完整性没有任何关系。