vb.net配对组合以创建所有可能的集合

时间:2014-10-31 16:16:22

标签: vb.net sorting

我需要帮助弄清楚如何编程解决这个问题。我有一对未知数量的对。每对是长度x宽度。我想创建每对可能的长度或宽度组合的集合。这是我正在尝试做的一个例子:

如果我输入3对,(1x2)(3x4)(5x6),我会得到以下几组: (1,3,5)(1,3,6)(1,4,5)(1,4,6)(2,3,5)(2,3,6)(2,4,5)( 2,4,6)

因此,如果我有4对,它将创建总共16组,等等。我需要能够输入每对,并且在输入所有对之后,我需要它来打印出集合。它永远不能包含同一组中给定对的两个数字。如何创建循环或是否有内置数学函数可以从给定数量的对输入生成所有可能的集合?我希望我能够很好地描述这个问题,但如果没有,请提出问题。感谢

1 个答案:

答案 0 :(得分:1)

这称为笛卡尔积。

例如,如果我们有两组A和B,那么

A = {1,2}

B = {3,4}

然后笛卡尔乘积A x B的结果等于

A x B = {(1,3),(1,4),(2,3),(2,4)}

如果现在我们想在上面获得的结果和新的集合之间制作笛卡尔积,例如:

N = {5,6}

笛卡尔乘积A x B x N的结果等于

A x B = {(1,3),(1,4),(2,3),(2,4)}
N = {5,6}
──────────────────────────────────────────────────
A x B x N = {(1,3,5),(1,3,6),(1,4,5),(1,4,6),(2,3,5),(2,3,6),(2,4,5),(2,4,6)}

第一组的每个元素必须与第二组的每个元素配对。

我为笛卡尔积开发了4种解决方案:

  1. 使用数学模型,但没有递归。这个解决方案 使用计算每个组合编号的向量。
  2. 使用递归,使用Collections类。
  3. 使用List(Of ...)类,也使用递归。
  4. 这三种解决方案在我看来很难解释。 此外,我很难用英语解释我的想法,因为我的母语是卡斯蒂利亚语。

    所以我努力创建另一个不使用递归的解决方案,这对任何程序员来说都更简单友好。

    最后,我可以创建一个令人满意的解决方案。易于理解,无需递归。 它也非常通用。根据需要,从2开始接受任意数量的集合。 您还可以使用任意数量的项目。这取决于每个开发人员的要求。

    我希望这是第四次。我设计的解决方案,将取悦你,尊敬的同事。

    只需要Form4中的ListBox1。这是:

    Public Class Form4
    
        Private Sub Form4_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    
            '┌─────────── Temporary code for example ───────────┐
            Dim Set_1 As List(Of String) = New List(Of String)
            Dim Set_2 As List(Of String) = New List(Of String)
            Dim Set_3 As List(Of String) = New List(Of String)
    
            Set_1.Add("1")
            Set_1.Add("2")
    
            Set_2.Add("3")
            Set_2.Add("4")
    
            Set_3.Add("5")
            Set_3.Add("6")
            '└──────────────────────────────────────────────────┘
    
            Dim Sets As List(Of Object) = New List(Of Object)
    
            Sets.Add(Set_1)
            Sets.Add(Set_2)
            Sets.Add(Set_3)
    
            Dim product As List(Of String) = Sets(0)
    
            For i = 1 To Sets.Count - 1
                product = CartesianProduct(product, Sets(i))
            Next
    
            For Each element As String In product
                Me.ListBox1.Items.Add(element)
            Next
    
        End Sub
    
        Private Function CartesianProduct(ByVal Set_A As List(Of String), ByVal Set_B As List(Of String)) As List(Of String)
    
            Dim product As List(Of String) = New List(Of String)
    
            For Each a As String In Set_A
                For Each b As String In Set_B
                    product.Add(a & b)
                Next
            Next
    
            Return product
        End Function
    End Class
    

    祝你有愉快的一天! :)