R 获取算法复杂度表的最有效方法

R 获取算法复杂度表的最有效方法,r,algorithm,time-complexity,R,Algorithm,Time Complexity,我试着用R填写“算法导论第三版”(MIT出版社出版)(第14页)中作为练习题给出的表格 //下面:由于G.巴赫的评论,增加了一句话 我本来应该把这些牢房填上 可以在时间t内解决的问题的最大大小n,假设解决问题的算法需要f(n)微秒 //上图:由于G.巴赫的评论,增加了一句话 我的代码如下所示 msec <- 1 sec <- msec * 1000000 min <- sec * 60 hour <- min * 60 day <- hour * 24 mon &

我试着用R填写“算法导论第三版”(MIT出版社出版)(第14页)中作为练习题给出的表格

//下面:由于G.巴赫的评论,增加了一句话

我本来应该把这些牢房填上

可以在时间t内解决的问题的最大大小n,假设解决问题的算法需要f(n)微秒

//上图:由于G.巴赫的评论,增加了一句话

我的代码如下所示

msec <- 1
sec <- msec * 1000000
min <- sec * 60
hour <- min * 60
day <- hour * 24
mon <- day * 30
year <- day * 365
cen <- year * 100

time_units = c( sec, min, hour, day, mon, year, cen )

time_funcs = list(
    lg_n = function(x) 2^x,
    sqrt_2 = function(x) x^2,
    itself = function(x) x,
    n_sq = function(x) sqrt(x),
    n_3sq = function(x) pracma::nthroot(x, 3),
    nsq_of_2 = function(x) log2(x)
)

obvious_vals <- sapply( time_units, plyr::each(time_funcs) )
但是,我不能得到nlog2(n)和n的反函数!(n阶乘)。 因此,我做了一个函数来得到n的近似值,如下所示。 (此代码仅适用于nlog2(n)。)

但我不确定我是否以最有效的方式完成了这些任务。 有谁有更好的办法来帮助我吗


提前谢谢。

如果您想使用数值优化,可以使用
uniroot

sapply(time_units, 
       function(time) uniroot(function(n) n * log2(n) - time, c(1e-8, 1e20))$root)
#[1] 6.274613e+04 2.801418e+06 1.333781e+08 2.755148e+09 7.187086e+10 7.976339e+11 6.861096e+13

为了获得更有效的方法,你必须求助于数学。

我不明白表格应该包含什么。你真正的问题是如何计算f(n)=n*log2(n)的倒数?@G.Bach哦,我没有解释它。对于每个表单元格,它们都应该包含。这是一个很好的观点!:)@罗兰:是的。我的实际问题是这样的,包括f(n)=n的倒数!只有在有可能用解析法计算它们的情况下。但如果我能用一些数值方法得到每一个平凡的解就好了。我实现了上面的一个案例(最后一个R代码)。但我不知道这是用最有效的算法实现的。
get_aprx_val <- function () {
    max_iter <- 100
    threshold <- 1.0e-07
    results <- rep( NA, length(time_units) )
    index <- 1

    for ( t_unit in time_units ) {
        x <- t_unit
        step <- .5 * t_unit

        for ( i in 1:max_iter ) {
            if ( x*log2(x) - t_unit >= threshold ) {
                x <- x - step
            }
            else if ( x*log2(x) - t_unit <= -threshold ) {
                x <- x + step
            }
            else {
                results[index] <- x
                break
            }
            step <- .5 * step
        }

        index <- index + 1
    }

    results
}
[1] 6.274613e+04 2.801418e+06 1.333781e+08 2.755148e+09 7.187086e+10 7.976339e+11 6.861096e+13
sapply(time_units, 
       function(time) uniroot(function(n) n * log2(n) - time, c(1e-8, 1e20))$root)
#[1] 6.274613e+04 2.801418e+06 1.333781e+08 2.755148e+09 7.187086e+10 7.976339e+11 6.861096e+13