【问题标题】:Time Complexity of Dependent for loop依赖 for 循环的时间复杂度
【发布时间】:2015-04-26 07:52:12
【问题描述】:
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),但找不到计算子循环的方法。那么,上述程序的时间复杂度是多少呢?

提前致谢。

【问题讨论】:

    标签: algorithm loops time-complexity complexity-theory probability


    【解决方案1】:

    让字符串的长度写成n。

    n = str.length();
    

    现在,外部 for 循环迭代整个字符串长度,即 n 次。因此,外部for循环复杂度为O(n)。

    说到子循环,内部的while循环执行(val)^(1/62)次。因此,您可以将内部 while 循环复杂度视为 O(log62 val)

    所有其他语句都具有恒定的时间复杂度。

    因此,净时间复杂度 = O(n * log62 val).

    最后一步是因为:-

    如果 f1(n) = O(g1(n)) 且 f2(n) = O(g2(n)),则 f1(n) * f2(n) = O(g1(n) * g2(n))

    正如Edward Doolittle 在评论中提到的,您可以将其减少到 O(n * log2 val),因为日志基数只能转换为基数 2具有恒定除法(按 log262)。

    【讨论】:

    • 通常简化为O(n log val),因为logs 到任何基数都等价于对数链式法则的常数。此外,由于val 依赖于i,你应该取val 的平均值。
    • @EdwardDoolittle-好吧,也必须为 OP 留下一些东西。顺便说一句,平均太麻烦了,无法包含在答案中。而且,我包括你的第一点。感谢您的建议...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多