【问题标题】:Print all the combinations for a numeric array in java在java中打印数字数组的所有组合
【发布时间】:2011-11-06 03:16:30
【问题描述】:

我有一个 int[10] 数组。 数组的每个插槽必须在 [0,30] 范围内,我想生成所有组合。我该怎么做?它可能很容易,但我有点卡住了 顺便说一句:

int[] array=new int[10];
for (int i=0;i<array.length;i++){
    for (int j=0;i<30;j++){
        print(array);
    }
}

但不会打印所有组合。

【问题讨论】:

  • 好的,你知道那是 30 045 015 种组合,对吧?
  • 是的,我知道有很多组合 =)
  • 真的不会是 31!/(31-10)! ?
  • 我认为排列这10个元素的方式只有3,628,800种——也就是10种!

标签: java algorithm permutation combinations


【解决方案1】:

您需要向该数组添加元素。第一个循环使您可以在内部访问变量 i,第二个循环为 j,但要填充它,我首先更喜欢递归方式:

为您的数组创建一个带有变量的方法和一个索引(接下来要在数组中填充哪个位置)。然后用新数组和 index = 0 调用方法

在方法1.检查索引是否已经超出数组范围。在这种情况下打印数组并退出方法 2. 在所有其他情况下,添加一个从 0 到 30 的 for 循环,在里面,将当前数字添加到位置 'index' 并再次调用该方法,给您的数组和索引+1

但我会先用更少的项目尝试这种方法。可能需要一段时间才能全部打印出来

这里有一个 vb.net 语言的例子。您不能直接复制粘贴它,但它可能有助于了解如何创建组合。

Private Sub AllCombinations(array() As Integer, index As Integer)
  If index < 10 Then
    For i As Integer = 0 To 30
      array(index) = i
      AllCombinations(array, index + 1)
    Next
  Else
    PrintMethod(array.ToString)
  End If
End Sub

Private Sub AllPermutations(array() As Integer, index As Integer, remaining As List(Of Integer))
  If index < 10 Then
    For Each ele In remaining
      array(index) = ele
      Dim newRemaining As New List(Of Integer)
      newRemaining.AddRange(remaining)
      newRemaining.Remove(ele)
      AllPermutations(array, index + 1, newRemaining)
    Next
  Else
    PrintMethod(array.ToString)
  End If
End Sub

index 0..9 是满数组,如果 index 为 10 则数组已满,我们只会显示它。要么我们用 0 到 30 之间的任何数字填充每个插槽,要么你保留一个列表来记住仍然剩余的数字(在排列中,你需要先用所有允许的数字填充剩余的列表!)

【讨论】:

  • 不确定我是否关注你——你为什么要递归地填充数组?而 AFAICT 数组中有 10 个数字,每个数字在 0-30 之间;没有理由为任何事情循环 30 次。唯一值得递归的是生成组合。
  • 没有要求填充(生成所有组合)?递归填充,因为这样程序代码更少,更容易更改。
  • 嗯,我想我误解了这个问题,实际上;认为 OPmm 意味着别的东西。
  • 嗯,也许您可​​以在您的问题中澄清一件事:数组 1,1,1,1,1,2,3,4,5,6 将是这些组合之一吗?还是该数组中的每个数字只允许一次?
【解决方案2】:

这是由 Kenneth H. Rosen 描述的算法,离散数学及其应用,第 2 版(纽约:McGraw-Hill,1991 年),第 284-286 页:CombinationGenerator - Java(链接已更新)

享受,

【讨论】:

    猜你喜欢
    • 2016-09-02
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多