【问题标题】:Is this brute-force algorithm NP-hard?这个蛮力算法NP难吗?
【发布时间】:2014-10-09 07:43:44
【问题描述】:

这是我们在项目管理系统中用于从摘要中提取关键字的蛮力算法。该蛮力算法的时间复杂度是多少?是 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;
}

【问题讨论】:

  • 标题语法不完全清楚,请复习...
  • 在您的代码中,存在两个嵌套的 for 循环。如果 M 足够小或 M 在有限范围内变化,则时间复杂度为 N 阶。如果 M 变化很大,则时间复杂度为 (N * M) 阶。
  • 我想知道像 NP hard(非确定性多项式)、NP 完全(非确定性、P 型(多项式)这样的类别)当我使用模式匹配的强力算法时,我的问题就出现了分析摘要或文本文档中的关键字...我如何确定算法将属于哪个类别???

标签: java string algorithm time-complexity np


【解决方案1】:

首先,只有问题可以在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-完整性没有任何关系。

【讨论】:

    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2011-11-08
    • 2014-12-08
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多