时间复杂度:连续求和数字的数字直到单个数字结果

时间:2016-12-10 07:21:23

标签: algorithm time-complexity

我给了一个数字N.继续对数字求和直到一位数结果。 例如35252 ==> 17 ==> 8 我写了以下代码:

<hibernate.version>3.5.5-Final</hibernate.version>
<hibernate-validator.version>4.2.0.Final</hibernate-validator.version>

时间复杂度: 给出N的范围为0 <= N <= 10 ^ 9。

在最坏的情况下,对于所有9,递归将最多两次,我将得到O(loglogn)

在最好的情况下,对于单个数字N,复杂度将为O(1)

平均复杂程度是多少?我的意思是,如果N可以是没有定义范围的任何数字,那么复杂性会是多少。

2 个答案:

答案 0 :(得分:3)

首先,你的分析是错误的,对于最坏的情况,时间复杂度不是O(loglogn),它是O(logn),具有以下递归公式:

T(n) = logn + T(log(n) * AVG(digits)) = logn + T(9*logn)
T(1) = 1

现在,我们可以使用感应假设:O(logn)

来显示以上内容位于T(n) <= 2logn
T(n+1) = log(n+1) + T(9logn) <= (i.h) log(n+1) + 2*log(9log(n)) =
       = log(n+1) + 2log(9) + 2loglog(n) < 2log(n)

显示Omega(log(n))非常简单,观察T(n) >= 0所有n

关于手头的问题,平均时间复杂度是多少,让我们用G(n)表示平均情况复杂度,让我们假设n是均匀分布的(如果不是 - 那会改变分析,结果可能会有所不同。)

G(N) = lim{N->infinity} sum{i=1 to N} T(n)/N =
     = lim{N->infinity} T(1) / N + T(2) / N + ... + T(N) / N
     = lim{N->infinity} 1/N (T(1) + T(2) + ... + T(N))
     < lim{N->infinity} 1/N (2log(1) + 2log(2) + ... + 2log(N)) 
     = lim{N->inifnity} 2/N (log(1) + ... + log(N))
     = lim{N->inifnity} 2/N (log(1 * 2 * ... * N))
     = lim{N->infinity} 2/N log(N!) 
     = lim{N->infinity} 2/N * CONST * NlogN = 2*CONST * logN

因此,我们可以得出结论G(N)也在O(logN),因此N中的平均案例分析仍然是对数。

答案 1 :(得分:0)

众所周知的解决方案是n%9 +(n%9 == 0?9:0)。