.net 返回行数组的所有组合的算法

.net 返回行数组的所有组合的算法,.net,vb.net,algorithm,.net,Vb.net,Algorithm,任务 获取数组的所有组合(数组是非常简单的1,2,3,4,5-仅表中行的索引,始终按顺序排列,因此我们可以只使用count number) 我需要的结果是:数组列表或列表列表(0:0,1:1,2:0,1,3:3,4:0,1,2…) 数据状态 表中有行,每行包含6列十进制数字。 我的目标是从每个选定行的列中获取最接近我的特定数字的数字之和(测试假设为600)。因此,我必须只选择包含壁橱编号的行 代码 周期性 Private Function CreateSubsets(Of T)(ByVal or

任务 获取数组的所有组合(数组是非常简单的1,2,3,4,5-仅表中行的索引,始终按顺序排列,因此我们可以只使用count number)

我需要的结果是:数组列表或列表列表(0:0,1:1,2:0,1,3:3,4:0,1,2…)

数据状态 表中有行,每行包含6列十进制数字。 我的目标是从每个选定行的列中获取最接近我的特定数字的数字之和(测试假设为600)。因此,我必须只选择包含壁橱编号的行

代码

  • 周期性

    Private Function CreateSubsets(Of T)(ByVal originalArray() As T) As List(Of T())
    
    Dim subsets As New List(Of T())
    
    For i As Integer = 0 To originalArray.Length - 1
    
        Dim subsetCount As Integer = subsets.Count
        subsets.Add(New T() {originalArray(i)})
    
        For j As Integer = 0 To subsetCount - 1
            Dim newSubset(subsets(j).Length) As T
            subsets(j).CopyTo(newSubset, 0)
            newSubset(newSubset.Length - 1) = originalArray(i)
            subsets.Add(newSubset)
        Next
    
    Next
    
    Return subsets
    End Function
    
  • 递归的

    Private Function GetAllCombos(Of T)(ByVal list As List(Of T)) As List(Of List(Of T))
    
    Dim result As List(Of List(Of T)) = New List(Of List(Of T))
    'head
    result.Add(New List(Of T))
    result.Last().Add(list(0))
    
    If (list.Count = 1) Then
        Return result
    End If
    
    'tail
    Dim tailCombos = GetAllCombos(list.Skip(1).ToList())
    tailCombos.ForEach(Sub(combo)
                           result.Add(New List(Of T)(combo))
                           combo.Add(list(0))
                           result.Add(New List(Of T)(combo))
                       End Sub)
    Return result
    
    End Function
    
  • 问题

    在这两种情况下都获得AxException“System.OutOfMemoryException”。
    我怎样才能避免这个问题,有什么解决办法吗?也许有人也有同样的任务。我无法禁用大型对象的限制-system.NET Framework 4.0 32位

    您尝试执行的函数的复杂性是数组中元素数量的阶乘,因此对于5个元素,它是5=120个组合,10个元素已经是10个了=3628800个组合。你的数组中实际有多少个元素?现在假设一个列表只需要10字节的RAM(提示:更多),那么你需要的RAM将比宇宙中的原子还要多。这是不可能的。(100!=9.332622e+157,这是一个带有157个可能的置换零的9)@Longoon12000我认为他真正感兴趣的是组合而不是置换,在他的例子中,实际上是~子集。这意味着这是一个错误!只有(2^n)-1他必须担心的项目,你的观点仍然站得住脚,尽管问题仍然存在,你说你想要所有元素的组合,即数组的所有子集。但是,如果数组中有100个项,则有2^100个子集。这不仅仅是一个64位的地址空间,如果你以每计算一毫秒的速度计算这些地址空间,那么需要10^20年等等