此算法的最坏情况运行时间是多少
What is the worst-case running time for this algorithm?
我正在为我的Facebook面试学习一些代码。 我了解这个算法的作用,但我无法弄清楚它的复杂性。 这是我访问过的网站上的声明:
由于围绕其中心扩展回文可能需要 O(N) 时间,因此整体复杂度为 O(N^2)。
有人可以向我解释他们是如何获得运行时间的,特别是平均和最坏的情况吗?
给出的问题是找到最大的回文子串。 我对字符串有点陌生。
我还想知道你们是否认为我应该学习Manacher算法,即O(N)。 这是一个更好的解决方案,使用更少的内存,但对我来说真的很难理解。
string expandAroundCenter(string s, int c1, int c2) {
int l = c1, r = c2;
int n = s.length();
while (l >= 0 && r <= n-1 && s[l] == s[r]) {
l--;
r++;
}
return s.substr(l+1, r-l-1);
}
string longestPalindromeSimple(string s) {
int n = s.length();
if (n == 0) return "";
string longest = s.substr(0, 1); // a single char itself is a palindrome
for (int i = 0; i < n-1; i++) {
string p1 = expandAroundCenter(s, i, i);
if (p1.length() > longest.length())
longest = p1;
string p2 = expandAroundCenter(s, i, i+1);
if (p2.length() > longest.length())
longest = p2;
}
return longest;
}
阅读 Big O 符号和算法分析以及其中的一点点,然后回来看看我的其余答案是否有意义。
在继续之前,我会使用 O(n) 算法检查字符串本身是否是回文。
让我们看看,你有一个运行 n 次的 for 循环,在每次迭代时,你调用一个运行 ...好吧,最糟糕的情况是,每次调用expandAroundCenter
时,您总是会找到最长的回文,即迭代运行到l < 0 || r > n-1
。这意味着该算法是O(min(i, n-i))
。现在,如果我们找到从 1 到 n 的和 min(i, n-i)
,我们得到这个,即 O(n²)。
相关文章:
- KMP算法和LPS表构造的运行时间
- 如何计算Big-O表示法中的平均渐近运行时间
- 用时钟测量程序的运行时间
- 如何减少代码的运行时间以对齐文本?
- 我的 c++ 应用程序中的运行时间从 0 增加到 60 太快了(例如一毫秒或一微秒)
- 使用 Qt 测量过程的实际运行时间
- 如何执行用 C++ 编写的程序的运行时间?
- 无限运行时间
- 如何优化C++键值程序以获得更快的运行时间
- 这个算法的运行时间复杂度是多少?你是如何分析的
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- 重复值的最长运行时间
- 同一程序的运行时间差异很大,有时达到1000+us
- 测量 OpenCL 应用程序的运行时间
- 为什么以相同的数量插入到集合中,基于不同的方法具有不同的运行时间?
- variadic函数模板:基于n编译时值在运行时间自动n输入
- 如何修复数据库连接的C 程序运行时间错误(0xc0000005)
- 该递归代码用于计算指数的运行时间是多少
- 此算法的最坏情况运行时间是多少
- 为 C++ 的容器调用 size() 函数的运行时间是多少