【发布时间】:2021-11-11 23:36:46
【问题描述】:
在下面的函数中,substr()的时间复杂度是O(n),在递归函数内部,递归调用是O(n),整个block的时间复杂度会是O( n^2) 那么呢?
void replacePi(string s) {
if(s.length() == 0) { // base case
return;
}
if(s[0] == 'p' && s[1] == 'i') {
cout << "3.14";
string remaining = s.substr(2); //remaining substring
replacePi(remaining);
} else {
cout << s[0];
replacePi(s.substr(1));
}
}
【问题讨论】:
-
问问自己会不会把递归拆分成多个递归?这对复杂性意味着什么?它们应该相加还是相乘。
-
应该添加吧?
-
是的,然后从订单中删除所有常量和低级订单,得到最终订单。哪个会?
-
是的,就是这样:)
-
如果初始长度为 N,您(在最坏的情况下)将复制 N-1 + N-2 + N- 3 + ... + 1 个字符。这个和是 (N - 1) * N / 2,也就是 O(n^2),