遍历组合的实现——VB2005
发布日期:2021-07-16 17:36:02 浏览次数:2 分类:技术文章

本文共 2411 字,大约阅读时间需要 8 分钟。

 

 

在数学的统计分支里,排列与组合是一个很重要的分支。在各种实际应用中,排列与组合也扮演了重要的角色。举例来说,安排人员参加活动可以看作是组合的应用。比方说,现在有十个人,选出其中的五个人参加某项集体活动。由于彼此之间有着脾气性格等因素,所以,不同的人员组合有着不同的工作效率。现在,要求你找出效率最高的人员安排。因为选出五人参加活动,没有顺序问题,因此是一个组合的问题。如果说,随机的选出一个组合,用计算机来实现是非常简单的,常见的“洗牌算法”就能实现。要找出效率最高的组合,只要遍历所有的组合即可。问题是如何遍历所有的组合。

还是利用数学知识,我们知道组合函数Cm,n)代表着从n个人选m个人的组合的可能数。那么C5,10=252就表示本题有252种选择。如果,给每一种组合都标上标号,不同的标号代表不同的组合,这样遍历所有的组合就转化为遍历标号了。

基于这个思想,完成下面的代码。其中,主函数有两个。

一个是

Public Shared Function C(ByVal C1 As Integer, _

 ByVal C2 As Integer) As Integer

用来计算组合数的,C1是上标,C2是下标。

 

另一个是

Public Shared Function GetCombination( _

ByVal Lower As Integer, _

ByVal Upper As Integer, _

ByVal Count As Integer, _

ByVal Index As Integer) As Integer()

     这是根据参数返回一个组合,

Lower表示返回组合的下限

Upper表示返回组合的上限

Count表示组合中的元素数

Index表示该组合的标号

 

     要获得一个组合,直接调用即可。如:

         Dim T() as Integer

         T= GetCombination(1,10,5,20)

     这个表示返回本题的一个组合,其中20是标号

    

如果想随机得到一个组合,只要给一个随机的标号即可

 

     要遍历组合,设置参数I即可。如:

         Dim T() as Integer,I as Integer

         For I=1 to C(5,10)

              T=GetCombination(1,10,5,I)

              DoSomeWork         执行根据组合计算效率的代码

         Next

     这样,就遍历了所有的组合

 

代码赋予其后,用的是VB2005

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()

 

        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 tS() As String = GetC(Lower, Upper, Count, Index) _

.Split(",".ToCharArray, _

 StringSplitOptions.RemoveEmptyEntries)

 

        Dim tI() As Integer

        ReDim tI(tS.GetUpperBound(0))

 

        Dim i As Integer

        For i = 0 To tI.GetUpperBound(0)

            tI(i) = tS(i)

        Next

 

        Return tI

    End Function

 

Private Shared Function GetC(ByVal Lower As Integer, _

ByVal Upper As Integer, _

ByVal Count As Integer, _

ByVal Index As Integer) As String

       

Dim i As Integer, tS As String

 

        If Count = Upper - Lower + 1 Then

            tS = ""

            For i = Lower To Upper

                tS &= i & ","

            Next

            Return tS

        End If

 

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

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

 

        If Index < i Then

            tS = Lower & "," & _

 GetC(Lower + 1, Upper, Count - 1, Index)

        Else

            tS = GetC(Lower + 1, Upper, Count, Index - i)

        End If

 

        Return tS

    End Function

 

Public Shared Function C(ByVal C1 As Integer, _

 ByVal C2 As Integer) As Integer

        If C1 < 0 OrElse C1 > C2 OrElse C2 <= 0 Then Return 0

        If C1 = 0 Then Return 1

 

        Dim i As Integer, S1 As Single = 1

 

        For i = 1 To C1

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

        Next

 

        Return S1

    End Function

End Class

 

 

转载地址:https://blog.csdn.net/grenet/article/details/4615779 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:本人Blog的文章目录
下一篇:2009年9月刊《程序员》算法题之我见——思索之二

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月15日 11时47分07秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

前后端交互 python mysql_*前后端交互2——python3+django2+连接外部数据库mysql 2019-04-21
mysql主键生成策略 uuid_主键生成策略 2019-04-21
python字符串变为字典_Python字符串内是字典,如何将它变成纯字典类型 2019-04-21
ajax图片上传java_Java使用Ajax实现跨域上传图片功能 2019-04-21
java 多线程 归并_java多线程合并文件-多线程读写 2019-04-21
java自动化运维_【Llinux】【jenkins】自动化运维四 整合gitlab、docker发布java项目... 2019-04-21
idea p3c 自定义_intelij idea 自定义live template总结 2019-04-21
java jaxp_java解析xml数据(使用jaxp的方式) 2019-04-21
java swing 文本编辑器_Java Swing文本编辑器的实现 2019-04-21
java 构造语句块_java中静态代码块,构造代码块,构造方法的执行流程 2019-04-21
java关键字定义字符变量_JavaSE第02篇:Java基础语法之变量、数据类型 2019-04-21
java泛型编程 指定基类_Java 泛型高级编程 ? 类型占位符的使用 | 学步园 2019-04-21
java数学_Java数学 2019-04-21
java xml获取子节点属性_XML的Java DOM解析-无法从子节点获得属性 2019-04-21
grpc java_grpc java入门教程 2019-04-21
java8 stream to map_java8 stream colloctors的toMap用法 2019-04-21
java equal 区别_Java中“==”与“equal()”的区别。 2019-04-21
java cloud_Spring Cloud 理论篇 2019-04-21
for语句java n_如何使用while、do、for循环语句分别编写Java应用程序,计算:f(n)=1+1/2+...1/n的结果?跪求高手帮忙,谢谢... 2019-04-21
java 简单的观察者模式_新手码农浅谈观察者模式(java语言简单实现) 2019-04-21