我正在实现不同版本的递归函数,该函数检查字符串是否是回文并为它们计算复杂度,但是对于将字符串大小作为参数传递或使用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()
函数返回大小所需的时间”,但是如果原始字符串的大小很大,这会不会有很大的延迟?这里的复杂度如何计算?
注意:我知道这不是递归检查字符串是否是回文式的最有效方法,我只是想更好地理解复杂性和递归。
答案 0 :(得分:2)
自C ++ 11起,std::string::size()
具有constant complexity。在此之前,它的复杂性was recommended to(“应该”)是恒定的,而且我知道没有编译器不遵循该建议。
实际上,字符串大小值已经存储在string
对象中,或者被计算为两个存储的指针之间的差。