天天看点

遍历排列的实现——VB2005

  代码赋予其后,用的是VB2005

  两个类,一个是clsPermutation,用来计算排列的;一个是clsCombination,用来计算组合的。下面,把各个函数说明一下。

  类clsPermutation:

  函数:GetPermutation

    获得指定标号的排列,返回值是一个数组

    参数: Lower,排列中的下限

               Upper,排列中的上限

               Count,排列中的元素的个数

               Index,该排列的标号

    示例: tI=GetPermutation(1,8,4,23)

                  返回一个从1到8中选4个数的一个排列,标号为23

  函数:GetPermutationRandom

       获得随机的排列,返回值是一个数组

       参数: Lower,排列中的下限

              Upper,排列中的上限

              Count,排列中的元素的个数

         示例: tI=GetPermutation(1,8,4)

                  返回一个从1到8中选4个数的一个排列

  函数:Factorial

         获得指定参数的阶乘,返回值是一个整数

         参数: N,指定参数

         示例: tI=Fratorial(4)

                  返回4的阶乘,为24

  函数:P

         获得指定参数的排列数,返回值是一个整数

         参数: M,指定参数上标;N,指定参数下标

         示例: tI=P(2,6)

                  计算P(2,6)的值,为30

  类clsCombination:

  函数:GetCombination

         获得指定标号的排列,返回值是一个数组

         参数: Lower,排列中的下限

                  Upper,排列中的上限

                  Count,排列中的元素的个数

                  Index,该排列的标号

         示例: tI=GetCombination(1,8,4,23)

                  返回一个从1到8中选4个数的一个组合,标号为23

  函数:GetCombinationRandom

         获得随机的排列,返回值是一个数组

         示例: tI=GetCombination(1,8,4)

                  返回一个从1到8中选4个数的一个组合

  函数:C

         示例: tI=C(2,6)

                  计算C(2,6)的值,为15

  代码格式修正于2012年1月5日

Public Class clsPermutation

  Private Shared mList() As Integer

  Public Shared Function GetPermutationRandom(ByVal Lower As Integer, ByVal Upper As Integer, ByVal Count As Integer) As Integer()

    If Count > Upper - Lower + 1 Then Return Nothing

    If Count <= 0 Then Return Nothing

    If Lower > Upper Then Return Nothing

    If Lower < 0 OrElse Upper < 0 Then Return Nothing

    Dim i As Integer

    ReDim mList(Upper - Lower)

    For i = 0 To mList.GetUpperBound(0)

      mList(i) = Lower + i

    Next

    Dim tR As New Random

    Call GetP(Upper - Lower + 1, Count, tR.Next(P(Count, Upper - Lower + 1)), 0)

    ReDim Preserve mList(Count - 1)

    Return mList

  End Function

  Public Shared Function GetPermutation(ByVal Lower As Integer, ByVal Upper As Integer, ByVal Count As Integer, ByVal Index As Integer) As Integer()

    Call GetP(Upper - Lower + 1, Count, Index, 0)

  Private Shared Sub GetP(ByVal Range As Integer, ByVal Count As Integer, ByVal Index As Integer, ByVal Start As Integer)

    Dim i As Integer, j As Integer

    Do While Count > 0

      j = P(Count, Range)

      Index = Index Mod j

      i = Int(Index / (j / Range))

      Call clsData.SwapNumber(mList(Start), mList(Start + i))

      Range -= 1

      Count -= 1

      Start += 1

    Loop

  End Sub

  Public Shared Function Factorial(ByVal N As Integer) As Integer

    Dim i As Integer, S1 As Integer = 1

    If N < 0 Then Return 0

    For i = 1 To N

      S1 *= i

    Return S1

  Public Shared Function P(ByVal M As Integer, ByVal N As Integer) As Integer

    For i = 1 To M

      S1 *= (N - i + 1)

End Class

Public Class clsCombination

  Public Shared Function GetCombination(ByVal Lower As Integer, ByVal Upper As Integer, ByVal Count As Integer, ByVal Index As Integer) As Integer()

    ReDim mList(Count - 1)

    Call GetC(Lower, Upper, Count, Index, 0)

  Public Shared Function GetCombinationRandom(ByVal Lower As Integer, ByVal Upper As Integer, ByVal Count As Integer) As Integer()

    Call GetC(Lower, Upper, Count, tR.Next(C(Count, Upper - Lower + 1)), 0)

  Private Shared Sub GetC(ByVal Lower As Integer, ByVal Upper As Integer, ByVal Count As Integer, ByVal Index As Integer, ByVal Start As Integer)

    Do While Count < Upper - Lower + 1

      Index = Index Mod C(Count, Upper - Lower + 1)

      i = C(Count - 1, Upper - Lower)

      If Index < i Then

        mList(Start) = Lower

        Lower += 1

        Count -= 1

        Start += 1

      Else

        Index -= i

      End If

    For i = Lower To Upper

      mList(i + Start - Lower) = i

  Public Shared Function C(ByVal M As Integer, ByVal N As Integer) As Integer

    If M < 0 OrElse M > N OrElse N <= 0 Then Return 0

    If M = 0 Then Return 1

    Dim i As Integer, S1 As Single = 1

      S1 *= (N - i + 1) / i

继续阅读