我给了一个数字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可以是没有定义范围的任何数字,那么复杂性会是多少。
答案 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)。