在递归函数中使用string的size()函数是否会导致较大的延迟/复杂性?

时间:2019-01-11 01:27:55

标签: c++ recursion time-complexity

我正在实现不同版本的递归函数,该函数检查字符串是否是回文并为它们计算复杂度,但是对于将字符串大小作为参数传递或使用size()函数进行计算并将其存储感到困惑在函数内部创建的变量中,哪个会更有效?

这是该函数的2个版本的示例:

bool isPalindrome1 (string s) {
    int sz = s.size();            // size calculated and stored
    if (sz < 2) return true;
    return ((s[0] == s[sz-1]) && isPalindrome1(s.substr(1, sz-2)));
}

bool isPalindrome2 (string s, int sz) {    //size passed as parameter
    if (sz < 2) return true;
    return ((s[0] == s[sz-1]) && isPalindrome2(s.substr(1, sz-2), sz-2));
}

第一个函数显然会花费更多的时间“ size()函数返回大小所需的时间”,但是如果原始字符串的大小很大,这会不会有很大的延迟?这里的复杂度如何计算?

注意:我知道这不是递归检查字符串是否是回文式的最有效方法,我只是想更好地理解复杂性和递归。

1 个答案:

答案 0 :(得分:2)

自C ++ 11起,std::string::size()具有constant complexity。在此之前,它的复杂性was recommended to(“应该”)是恒定的,而且我知道没有编译器不遵循该建议。

实际上,字符串大小值已经存储在string对象中,或者被计算为两个存储的指针之间的差。