依赖for循环的时间复杂度
Time Complexity of Dependent for loop
string str = "abcdefghijklmnopqrstuvwxyz";
int sum = 0;
for(int i=0; i<str.length; i++)
{
int val = str[i];
while(val > 0)
{
sum = val % 62;
val = val / 62;
}
}
我知道父循环执行n+1次,子循环执行(val)^(1/62)次。对于父循环,时间复杂度将为 O(n),但找不到计算子循环的方法。那么,上述程序的时间复杂度是多少?
提前致谢。
让字符串的长度写成n。
n = str.length();
现在,外部 for 循环遍历字符串的整个长度,即 n 次。因此,外部 for 循环复杂度为 O(n)。
关于子循环,内部 while 循环执行 (val)^(1/62) 次。因此,您可以将内部 while 循环复杂度视为 O(log62 val).
所有其他语句都采用常数时间复杂度。
因此,净时间复杂度= O(n * log62 val).
最后一步是因为:-
If f1(n) = O(g1(n)) and f2(n) = O(g2(n)),then f1(n) * f2(n) = O(g1(n)
* g2(n))
如评论中 Edward Doolittle
所述,您可以将其减少到 O(n * log2 val)因为对数基数只能通过常数除法(按 log262)转换为基数 2。
string str = "abcdefghijklmnopqrstuvwxyz";
int sum = 0;
for(int i=0; i<str.length; i++)
{
int val = str[i];
while(val > 0)
{
sum = val % 62;
val = val / 62;
}
}
我知道父循环执行n+1次,子循环执行(val)^(1/62)次。对于父循环,时间复杂度将为 O(n),但找不到计算子循环的方法。那么,上述程序的时间复杂度是多少?
提前致谢。
让字符串的长度写成n。
n = str.length();
现在,外部 for 循环遍历字符串的整个长度,即 n 次。因此,外部 for 循环复杂度为 O(n)。
关于子循环,内部 while 循环执行 (val)^(1/62) 次。因此,您可以将内部 while 循环复杂度视为 O(log62 val).
所有其他语句都采用常数时间复杂度。
因此,净时间复杂度= O(n * log62 val).
最后一步是因为:-
If f1(n) = O(g1(n)) and f2(n) = O(g2(n)),then f1(n) * f2(n) = O(g1(n) * g2(n))
如评论中 Edward Doolittle
所述,您可以将其减少到 O(n * log2 val)因为对数基数只能通过常数除法(按 log262)转换为基数 2。