【问题标题】:Code complexity [closed]代码复杂度[关闭]
【发布时间】:2017-02-09 09:10:49
【问题描述】:

谁能给我解释一下下面代码的时间复杂度:

cin >> n;
while(n>9)
{
    int num = n;
    int s = 0;
    while(num!=0)
    {
        s = s + num%10;
        num = num/10;
    }
    n = s;
}
cout<<n<<endl;

上面的代码计算数字的各位数字的总和,直到总和变成一位数。

例如:45859 = 4+5+8+5+9 = 31 = 3+1 = 4

编辑:我认为计算数字总和的内循环具有 O(log_base_10(n)) 复杂度,但外循环一直持续到到目前为止获得的总和小于 10。所以总复杂度取决于外循环要运行多少次。我无法弄清楚...计算外循环复杂度的某种数学噱头会有所帮助!!!

【问题讨论】:

  • 复杂性体现在哪些方面?从智力的角度来看,复杂性趋于为零。
  • 我的直觉告诉我这是O( N * M ),其中 N 是初始输入的大小,M 与每个数字的平均值成正比。但是由于 M 不能高于9 * k,所以我只考虑它O(N)
  • 计算大 O 是编程中的一种仪式。除非您说出您的想法和原因,否则您不会在 Stack Overflow 上获得太多有用的帮助。然后你可能会得到 cmets 说“你知道了”或解释你为什么错的答案,你可能会从中推断出正确的答案。
  • 投反对票,因为这对其他人没有用处。 SO 不是帮助台。

标签: c++ algorithm time-complexity


【解决方案1】:

您正在计算数字的总和。 n 中的位数与 log(n) 成比例。

【讨论】:

  • 其实就是数位之和。如果内循环返回一个大于 9 的总和 - 例如 99993 总和为 9+9+9+9+3=39 - 外循环在 39 上再次运行。39 总和为 3+9=12。 12 和为 1+2=3。我认为这变成了O( log(log(n)) )
  • @David:外循环第一次运行需要 O(log(n)) 时间。第二次确实需要 O(log(log(n))),第三次(如果你有一个非常大的输入)O(log(log(log(n)))) 等等,但是整体仍然是 O(log(n))。
  • 我明白了,你是对的。最坏情况的总时间与总和成正比O(log(n)) + O(log(log(n))) + ...,但第一项占主导地位,时间复杂度变为O(log(n))。
猜你喜欢
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2018-08-29
相关资源
最近更新 更多