在Scala中找到给定长度的所有可能的递增子序列

时间:2018-09-20 06:06:18

标签: scala

在Scala中查找给定长度的所有可能的递增子序列的有效方法是什么?

例如:假设有一个数字序列,如下所示:

7 6 9 11 16 10 12

上述序列的大小为3的可能递增子序列为:

7 9 11
7 9 16
7 9 10
7 9 12
7 11 16
7 11 12
7 10 12
6 9 11
6 9 16 
etc…

我想知道哪种Scala数据结构将有助于快速找到子序列。

2 个答案:

答案 0 :(得分:0)

这是您问题的Scala解决方案:

def subSequence[A](list: List[A], size: Int)(implicit ord: Ordering[A]): List[List[A]] =
  if (size <= 1) {
    list.map(List(_))
  } else {
    ( for {
        t1 <- list.tails if t1.length >= size - 1
        a = t1.head
        t2 <- subSequence(t1.tail, size - 1)
        b = t2.head if ord.lt(a, b)
      } yield a :: t2
    ).toList
  }

希望其他人会提供此功能的尾递归版本,

答案 1 :(得分:-1)

这是一种可能的解决方案。

val l = List(7, 6, 9, 11, 16, 10, 12)
l.combinations(3).filter(x => x == x.sorted) // this gives the desired result for size 3 and `3` can be changed to some number `n` for different size of combinations.

我刚刚创建了组合并稍后进行了过滤,但这可能不是很有效。但是,我有兴趣通过仅生成递增的组合来了解更有效的答案。