程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了保留其元素在同一列表中没有适当子集的向量(来自向量列表)(使用 RCPP)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决保留其元素在同一列表中没有适当子集的向量(来自向量列表)(使用 RCPP)?

开发过程中遇到保留其元素在同一列表中没有适当子集的向量(来自向量列表)(使用 RCPP)的问题如何解决?下面主要结合日常开发的经验,给出你关于保留其元素在同一列表中没有适当子集的向量(来自向量列表)(使用 RCPP)的解决方法建议,希望对你解决保留其元素在同一列表中没有适当子集的向量(来自向量列表)(使用 RCPP)有所启发或帮助;

我之前 (see herE) 已经问过这个问题,并使用 purr 包得到了满意的答复。然而,事实证明这在我的程序中是一个瓶颈,所以我想使用 RCPP 包重写该部分。

真子集:集合 S 的真子集 S' 是严格包含在 S 中的子集,因此排除了 S 本身(注意我也排除了空集)。

假设您在列表中有以下向量:

a = c(1,2)
b = c(1,3)
c = c(2,4)
d = c(1,2,3,4)
e = c(2,4,5)
f = c(1,3)

我的目标是只保留列表中没有真子集的向量,在这个例子中是 a、b 和 c。

以前的解决方案

library(purr)

possibilitIEs <- List(a,b,c,d,e,f)
keep(possibilitIEs,map2_lgl(.x = possibilitIEs,.y = seq_along(possibilitIEs),~ !any(map_lgl(possibilitIEs[-.y],function(z) all(z %in% .X)))))

解决方法

这里的概念是避免 O(N^3) 并使用较少的顺序。此处提供的另一个答案仍然很慢,因为它大于 O(N^2)。这是一个小于 O(N^2) 的解决方案,其中最坏的情况是 O(N^2) 当所有元素都是唯一的。

onlySet <- function(X){
   i <- 1
  repeat{
    y <- sapply(x[-1],function(el)!all(is.element(x[[1]],el)))
    if(all(y)){
      if(i==length(X)) break
      else i <- i+1
    }
    x <- c(x[-1][y],x[1])
  }
  x
}

现在要显示时差,请查看以下内容:

@H_507_3@match_fun <- Vectorize(function(s1,s2) all(s1 %in% s2))
method1 <- function(a){
 mat <- outer(a,a,match_fun)
 a[colSums(mat) == 1]
}

poss <- rep(possibilities,100)

microbenchmark::microbenchmark(method1(poss),onlySet(poss))

Unit: milliseconds
          expr      min        lq       mean    median        uq       max neval cld
 method1(poss) 840.7919 880.12635 932.255030 889.36380 923.32555 1420.1077   100   b
 onlySet(poss)   1.9845   2.07005   2.191647   2.15945   2.24245    3.3656   100  a 
,

您是否尝试过先在基础 R 中优化解决方案?例如,以下内容重现了您的预期输出并使用(更快)基本 R 数组例程:

@H_507_3@match_fun <- Vectorize(function(s1,s2) all(s1 %in% s2))
mat <- outer(possibilities,possibilities,match_fun)
possibilities[colSums(mat) == 1]
#[[1]]
#[1] 1 2
#
#[[2]]
#[1] 1 3
#
#[[3]]
#[1] 2 4

受 Onyambu 高性能解决方案的启发,这里是另一个使用递归函数的基本 R 选项

f_recursive <- function(x,i = 1) {
    if (i > length(X)) return(X)
    idx <- which(sapply(x[-i],function(el) all(x[[i]] %in% el))) + 1
    if (length(idX) == 0) f_recursive(x,i + 1) else f_recursive(x[-idx],i + 1)
}
f(possibilities)

性能与 Onyambu 的解决方案相当。

poss <- rep(possibilities,100)
microbenchmark::microbenchmark(
    method1(poss),onlySet(poss),f_recursive(poss))
#Unit: milliseconds
#              expr        min         lq       mean     median         uq
#     method1(poss) 682.558602 710.974831 750.325377 730.627996 765.040976
#     onlySet(poss)   1.700646   1.782713   1.870972   1.819820   1.918669
# f_recursive(poss)   1.681120   1.737459   1.884685   1.806384   1.901582
#         max neval
# 1200.562889   100
#    2.371646   100
#    3.217013   100

大佬总结

以上是大佬教程为你收集整理的保留其元素在同一列表中没有适当子集的向量(来自向量列表)(使用 RCPP)全部内容,希望文章能够帮你解决保留其元素在同一列表中没有适当子集的向量(来自向量列表)(使用 RCPP)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: