【问题标题】:Find all possible increasing subsequences of a given length in Scala在Scala中查找给定长度的所有可能增加的子序列
【发布时间】:2019-02-24 09:08:18
【问题描述】:

在 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 数据结构有助于快速找到子序列。

【问题讨论】:

  • 您使用哪种编程语言?你已经用其中的 5 个标记了这个问题......另外:对子序列的长度有限制吗?我看到你只创建了 3 个元素的子序列......
  • 您可以通过提供一些您尝试过的代码并删除除 scala 之外的标签来改进此问题
  • 由于您在标题和问题正文中提到了 Scala,我已经删除了其他不相关的语言标签。不要用多种语言标记一个问题——你会被无情地否决。
  • 我正在使用 Scala,但如果有人给出优化的方法,无论使用何种语言,我都会不胜感激。子序列长度可以是任何东西,我刚刚给出了例子
  • 在寻求帮助之前,您需要证明您已经尝试过回答这个问题。

标签: scala


【解决方案1】:

这是您问题的 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
  }

希望其他人会提供一个尾递归版本,它应该表现更好。

【讨论】:

    【解决方案2】:

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

    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.
    

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

    【讨论】:

    • 这适用于测试数据,但如果列表中有重复值,则会中断,因为combinations 删除重复值,sorted 不强制增加值。
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    相关资源
    最近更新 更多