哪种积累矢量更有效?

时间:2017-08-27 03:36:47

标签: r recursion vector accumulate

以下哪项在完成时间方面更有效?

one.way = function(n) { if (n) c(n, one.way(n-1)) }
two.way = function(n) { if (n) c(two.way(n-1), n) }

这里强调的是将单例向量与另一个长度可能大于1的向量组合的顺序。

如果在使用上述功能之一构建向量后需要包含反转向量的时间,您的答案会如何变化?在组合时可能会或可能不知道将需要组合对象的顺序。

1 个答案:

答案 0 :(得分:0)

要回答你的问题,他们是平等的

使用microbenchmark测试两个快速函数的性能

one.way = function(n) { c(n, 1) }
two.way = function(n) { c(1, n) }

n <- 2:100

library(microbenchmark)
microbenchmark(one.way(n), two.way(n), times=1e5)

#       expr   min    lq     mean median    uq      max neval
# one.way(n) 1.399 1.866 2.009775  1.867 1.867 2817.733 1e+05
# two.way(n) 1.399 1.866 2.086267  1.867 1.867 3394.808 1e+05

请注意,下四分位数,中位数和上四分位数都是相同的。手段略有不同,但并不重要。见下文

myfun <- function(n) {
              temp <- microbenchmark(one.way(n), two.way(n), times=1e5)
              df <- data.frame(one.way = mean(temp$time[temp$expr=="one.way(n)"]),
                           two.way = mean(temp$time[temp$expr=="two.way(n)"]))
              return(df)
     }

library(purrr)
test <- map_df(1:100, ~myfun(n))

t.test(test$one.way, test$two.way)

# data:  test$one.way and test$two.way
# t = -1.6506, df = 182.72, p-value = 0.1005
# alternative hypothesis: true difference in means is not equal to 0