【问题标题】:R: Print ALL Longest Increasing Subsequences (LIS)R:打印所有最长递增子序列(LIS)
【发布时间】:2019-06-19 15:08:41
【问题描述】:

给定一个向量

x <- c(4,5,6,7,8,9,10,11,12,13,15,14,13,12,11,10,9,8,6)

查找所有最长的递增子序列 (LIS)

解决方案应该是这样的

4,5,6,7,8,9,10,11,12,13,14

4,5,6,7,8,9,10,11,12,13,15

我什至可以处理元素的索引

我使用了JINJING XIE给出的代码,但它只返回一个序列

任何帮助将不胜感激

【问题讨论】:

    标签: r dynamic lis


    【解决方案1】:

    这是一个计算它的(缓慢且效率不高的)函数(使用RcppAlgos

    max_sub_sequences <- function (x) {  
      # x incresing, result is obviously x
      if (all(diff(x) > 0)) return (x)
      N <- length(x)
      n <- N - 1L 
      break_condition <- TRUE
      while (break_condition) {
        # generate all combinations of indices
        combinations <- RcppAlgos::comboGeneral(1:N,n)    
        # get subsequences according to indices
        sub_sequences <- matrix(x[combinations[1:nrow(combinations),]], nrow = nrow(combinations)) ; rm(combinations)
        # check monotony 
        index_subsequence <- vapply(1:nrow(sub_sequences), function (k) any(diff(sub_sequences[k,]) < 1L), logical(1L))
        # keep increasing sequences only
        sub_sequences <- sub_sequences[!index_subsequence,] ; rm(index_subsequence)
        break_condition <- nrow(sub_sequences) == 0L
        n <- n - 1L
      }
      sub_sequences
     }
    max_sub_sequences(c(4,5,6,7,8,9,10,11,12,13,15,14,13,12,11,10,9,8,6))    
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11]
    # [1,]    4    5    6    7    8    9   10   11   12    13    15
    # [2,]    4    5    6    7    8    9   10   11   12    13    14  
    
    # timing
    # Unit: seconds
    #                 expr     min       lq     mean   median       uq      max neval
    # max_sub_sequences(x) 1.30611 1.462473 1.502727 1.484785 1.522796 1.821037   100
    

    确实有一些方法可以提高效率,例如其他逻辑或将其写入c++ 并使用Rcpp 完成整个任务。

    【讨论】:

    • 谢谢!效果很好,你是对的,它有点慢。我试图使计算时间尽可能短。感谢您的帮助。
    • 由于内存限制,大向量也会失败x &lt;- (18,19,17,16,15,14,13,12,11,10,9,8,9,10,12,13,14,15,16,17,19,17,16,15,14,13,12,11,10,9,8,9,10,11,12,13,14,15,16,17,18,19,18,19,17,16,15,14,13,12,11,10,9,7,6,5,4,3,2,1)
    • @jonnyblue8 是的,我注意到了,这对于单调性很小的大型向量尤其不利。最好的方法可能是编辑您找到的代码,使其返回所有值(或查找算法),然后在Rcpp 中实现它以提高效率。我会编辑我的答案,我应该设法提供一些东西。
    猜你喜欢
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 2021-11-04
    • 1970-01-01
    • 2014-10-25
    • 2014-05-20
    • 2013-07-03
    相关资源
    最近更新 更多