这是我们在项目管理系统中用于从摘要中提取关键字的强力算法。这种强力算法的时间复杂度是多少?它是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;
}
答案 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 - 完整性没有任何关系。