在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数据结构将有助于快速找到子序列。
答案 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.
我刚刚创建了组合并稍后进行了过滤,但这可能不是很有效。但是,我有兴趣通过仅生成递增的组合来了解更有效的答案。