为什么nlogn难以反转?

时间:2010-12-09 15:53:12

标签: math r complexity-theory invert

假设我有一个在空间要求中具有nlogn的函数,我想为给定的可用空间计算出该函数的最大输入大小。即我想找到n,其中nlogn = c。

我跟着an approach来计算n,在R中看起来像这样:

step = function(R, z) { log(log(R)-z)} 
guess = function(R) log(log(R))

inverse_nlogn = function(R, accuracy=1e-10) {
 zi_1 = 0
 z = guess(R)
 while(abs(z - zi_1)>accuracy) { 
  zi_1 = z
  z = step(R, z)
 }
 exp(exp(z))
}

但是我无法理解为什么它必须迭代地解决。对于我们感兴趣的范围(n> 1),函数是非单数的。

3 个答案:

答案 0 :(得分:4)

n log n 没什么特别的 - 几乎所有的基本函数都没有基本的反转,所以必须通过其他方法解决:二分,牛顿的方法,拉格朗日反演定理,级数逆转,Lambert W函数......

答案 1 :(得分:2)

正如Gareth暗示兰伯特W函数(eg here)几乎让你在那里,确实n = c / W(c)

谷歌找到了this,这可能会有所帮助。

答案 2 :(得分:1)

跟进(完全明确):

library(emdbook)

n <- 2.5

c <- 2.5*log(2.5)
exp(lambertW(c))  ## 2.5

library(gsl)
exp(lambert_W0(c)) ## 2.5

两种实现的速度,准确性等可能存在细微差别。我没有广泛测试/基准测试。 (现在我试过了

library(sos)
findFn("lambert W")

我发现它已经在各地实施:游戏包,以及一个名为LambertW的整个包......