【发布时间】:2013-08-26 03:11:48
【问题描述】:
我正在尝试分析以下函数的时间复杂度。该函数用于检查一个字符串是否由其他字符串组成。
set<string> s; // s has been initialized and stores all the strings
bool fun(string word) {
int len = word.size();
// something else that can also return true or false with O(1) complexity
for (int i=1; i<=len; ++i) {
string prefix = word.substr(0,i);
string suffix = word.substr(i);
if (prefix in s && fun(suffix))
return true;
else
return false;
}
}
我认为时间复杂度是O(n),其中 n 是单词的长度(对吗?)。但是由于递归在循环内,我不知道如何证明它。
编辑:
此代码不是正确的 C++ 代码(例如,prefix in s)。我只是展示这个函数的思想,想知道如何分析它的时间复杂度
【问题讨论】:
-
我怀疑是
O(n)。外层循环执行n次,每一次都再次调用该函数。我在想一些不好的事情,比如O(2^n)。你能解释一下由其他字符串组成的字符串是什么意思吗? -
@Teepeemm 喜欢 word1 = abcdef,word2 = abc,word3 = def。 word1 由 word2 和 word3 组成
-
这段代码看起来有问题。循环不应该从
i=1开始吗?实际上,除非s包含空字符串,否则它总是会立即返回false,如果s确实包含空字符串,它将无限递归。此外,除非s被初始化,否则prefix in s将始终评估为false。这也会使函数立即返回false。 -
@TedHopp 是的,此代码不正确。我只是想展示这个函数的想法并决定它的复杂性