最近,我遇到了一个代码段:
int i = 1;
while (N > 1)
{
N = N / i;
i = i + 1;
}
在观察时,很明显i
线性增加,i
在循环的每个运行时间中划分N
,因此我们可以说N
减少为阶乘的反函数的函数。
我们如何在 theta符号中表示这一点,因为没有为每个自然数N
定义反向因子?我们是否需要使用此函数的近似上限和下限?
答案 0 :(得分:4)
嗯,我不确定,但我会试一试。
因子本质上是gamma function。伽马函数不仅定义为自然数,还定义为实数。因此,在理论上,存在一个反伽马函数,它是针对未定义阶乘的情况定义的(例如,我们不知道5
的反因子,但我们知道, 5
的反伽马函数将是两点左右的东西。根据{{3}},反伽马函数没有精确的公式,但有近似解。
我们假设存在反伽马函数,并将其写为InvGamma(N)
。这是一个实数(可能是R +,但我不确定,它现在不重要,因为我们的N总是正的,除了N == 0的情况,我现在将忽略)
然后,当我们处理复杂性时,我们可以像使用返回实数的其他函数一样使用它:我们可以floor
它(向下舍入)。就像我们处理log
复杂性一样。我曾经使用方括号(即log(15) = 1.18
,[log(15)] = 1
)来写。
然后,我相信你的代码段的复杂性应该是O([InvGamma(N)])
。
更新(受@ 6502答案的启发):请注意,如果N
是一个整数(代码段中没有提及),那么每一步都会有一个四舍五入,这会以复杂的方式改变复杂性。上述解决方案适用于真实的N
。
答案 1 :(得分:1)
对于除负整数之外的所有复平面的阶乘的“自然”扩展称为"gamma function",并且在所有非负整数gamma(n) = (n-1)!
上。
因此,你可以反转一部分伽玛来计算所需的近似迭代次数但是我不确定这会导致迭代次数的精确计算,就像在那个代码中那样每一步都要进行一次舍入操作。