【问题标题】:Time Complexity of substr inside a Recursive Function递归函数中 substr 的时间复杂度
【发布时间】: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),

标签: c++ recursion stl


【解决方案1】:

您的函数replacePi 使用n-2n-1 的字符串长度为n 次数。因此,如果您有一个长度为 n 的字符串 - 那么复杂性将是:

o(n * ((n-2) or (n-1))) 
=> o(n * n) 
=> o(n^2)

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 2018-08-18
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多