【问题标题】:Scala function to get all sorted subsets of size kScala函数获取大小为k的所有排序子集
【发布时间】:2011-11-15 13:29:54
【问题描述】:

给定一组大小为 L 的集合,并希望生成大小为 k 的每个排序子集。 如果您的解决方案在 scala 中会很棒,但也许我可以自己翻译。

运行 L = 6 和 k = 3 的示例应该会产生结果。

1、2、3
1、2、4
1、2、5
1、2、6
1、3、4
1、3、5
1、3、6
1、4、5
1、4、6
1、5、6
2、3、4
2、3、5
2、3、6
2、4、5
2、4、6
2、5、6
3、4、5
3、4、6
3、5、6
4、5、6

我的 scala 尝试是这样的:

object Util {
  def main(args : Array[String]) : Unit = {
    starts(6,3,1)
  }

  def starts(L: Int, num: Int, level: Int) : List[List[Int]] = {
    if( num == 0 ) {
      return List()
    }else{
      (level to (L-num+1)).map( o => o :: starts(L,num-1,level+1))
    }
  }
}

我希望你能帮助我。

【问题讨论】:

  • 我希望你能帮助自己,因为我不知道你想要什么,而且听起来像是功课
  • 这不是功课。我只想学习解决这个问题的 scala 方法。

标签: function scala permutation sorted


【解决方案1】:

你只需要

def subsets(L: Int, k: Int) =  
  1 to L combinations k

结果:

scala> subsets(6, 3) foreach println
Vector(1, 2, 3)
Vector(1, 2, 4)
Vector(1, 2, 5)
Vector(1, 2, 6)
Vector(1, 3, 4)
Vector(1, 3, 5)
Vector(1, 3, 6)
Vector(1, 4, 5)
Vector(1, 4, 6)
Vector(1, 5, 6)
Vector(2, 3, 4)
Vector(2, 3, 5)
Vector(2, 3, 6)
Vector(2, 4, 5)
Vector(2, 4, 6)
Vector(2, 5, 6)
Vector(3, 4, 5)
Vector(3, 4, 6)
Vector(3, 5, 6)
Vector(4, 5, 6)

根据需要。

【讨论】:

  • 我认为作为一名 Scala 程序员,应该知道这个库。 :D
【解决方案2】:

你可以从那开始

def subsets(start: Int, end: Int, count: Int) :Seq[Seq[Int]] = (
  if (count == 0) 
    List(Nil)
  else 
    for(head <- start to end; tail <- subsets(head + 1, end, count -1)) 
    yield head +: tail
)

【讨论】:

    【解决方案3】:

    如果您实际上有 blocks 而不是 entries,那么您需要知道每个 block 有多长。您显示的是条目(或等效地,长度为 1 的块)。

    首先,请注意我们必须有L&gt;=k。其次,请注意,如果第一个条目是i,则剩余的可能性是i+f(L-i,k-1),其中f 是生成条目的原因,并假设+ 分布在集合中。最后,我们注意到 flatMap 具有为每个元素生成序列的函数,会将结果解压缩为单个序列。

    现在我们已经掌握了我们需要知道的一切:

    def choices(N: Int, k: Int): List[List[Int]] = {
      if (k==1) (1 to N).toList.map(x => List(x))
      else if (N < k) Nil
      else (1 to 1+N-k).toList.flatMap{ i =>
        choices(N-i,k-1).map(xs => i :: xs.map(_ + i))
      }
    }
    

    如果您确实是指块,那么我们需要知道块的长度。分析是一样的,只是我们需要跳过块大小,而不是只跳过一个值:

    def blockchoices(N: Int, k: Int, size: Int): List[List[Int]] = {
      if (k==1) (1 to N+1-size).toList.map(x => List(x))
      else if (N <= k+size) Nil
      else (1 to 2+N-k-size).toList.flatMap{ i =>
        choices(N-i+1-size, k-1, size).map(xs => i :: xs.map(_ + i+size-1))
      }
    }
    

    (列出了块的起始条目)。

    【讨论】:

    • 伟大的补充。我也对这个解决方案感兴趣。不幸的是,对可变长度块的泛化会爆炸我的统计模型的复杂性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    相关资源
    最近更新 更多