假设我有一个在空间要求中具有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),函数是非单数的。
答案 0 :(得分:4)
n log n 没什么特别的 - 几乎所有的基本函数都没有基本的反转,所以必须通过其他方法解决:二分,牛顿的方法,拉格朗日反演定理,级数逆转,Lambert W函数......
答案 1 :(得分:2)
答案 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的整个包......