遍历组合的实现——VB2005

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

      还是利用数学知识,我们知道组合函数C(m,n)代表着从n个人选m个人的组合的可能数。那么C(5,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(代码格式修正于2012年1月5日) 

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

时间: 2024-10-09 19:18:47

遍历组合的实现——VB2005的相关文章

遍历排列的实现——VB2005

前两日,写了一篇"遍历组合的实现--VB2005".在数学分支里,排列与组合是不分家的.于是,动手写下本文.在上一文中,采用了递归调用,虽然便于理解,但是算法的效率上打个折扣.本文一并重写,改为循环调用. 代码赋予其后,用的是VB2005 两个类,一个是clsPermutation,用来计算排列的:一个是clsCombination,用来计算组合的.下面,把各个函数说明一下. 类clsPermutation: 函数:GetPermutation 获得指定标号的排列,返回值是一个数组 参

遍历组合算法的模块化

在日常的需求设计中,遍历组合是一个常见的问题. 例如:现在有N个不同的数.要求在其中找到M个数,使得M个数之和为指定的S,求所有满足条件的组合. 这是一个很明显的遍历组合的问题.一般采用递推算法,求出满足条件的解. 这类问题一般都采用一个数组P,来存放解.遍历整个组合空间,来找出解(有可能是所有解.也可能是一个解,根据题目要求来定) 由于这类问题解法是固定的,故在此把该算法模块化.留待日后查阅用.   上图是该算法的算法流程图 下面贴出该算法的伪代码,用的是VB2005 Public Sub T

算法题——一道数字组合的题目的求解

题目:给定一个数字,和一个范围,产生所有在范围内的不重复的数字之和,和等于给定的数字. 举例:给数字12,范围3-6.可以产生以下5个组合: 1.3+3+3+3 2.3+3+6 3.3+4+5 4.4+4+4 5.6+6 要求给出最快实现,并且是非递归. 这是某人给我出的一道算法题.经过考虑,给出了解法.最快的谈不上(算法无止境.人外有人),没有用递归.   还是以题目的例子说明,数字12,范围3-6.给出了5种组合.将这5种组合改写一下 3+3+3+3=3*4+4*0+5*0+6*0 记作:(

Head First Design Patterns

    在更大的计划之前,先温习一下Design Pattern的功课.    看了<Head First Design Patterns>里讲Decorator的样章,发现JOLT大奖不是白拿的,叙事能力之强,表达之清晰,不是那些满腹经伦的老先生可以比的.而且整个Pattern的讲述过程循序渐进,真的可以保证--小白都能学会设计模式.    可惜就只有样章.Head First系列的电子书都不好找,只好还是翻出老先生们的书来看.    这次温习很快做完,其实GOF80%的模式,都是基于一个原

代码-html页面的动态加载后台传回来的数据?

问题描述 html页面的动态加载后台传回来的数据? 一直写静态代码,没做过数据动态加载.比如静态html页面中: <div> <div class=""title""></div> <div> <img src=""test.jpg"" alt=""图片""/> </div> <div class="

iOS设计模式之迭代器模式

迭代器模式 基本理解 迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示. 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式. 你需要对聚集有多种方式遍历时,可以考虑用迭代器模式. 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据. 迭代器定义了一个用于访问集合元素并记录当前元素的接口. 不同的迭代器可以执行不同

iOS App设计模式开发中对迭代器模式的使用示例_IOS

何为迭代器模式?     迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节.遍历集合中元素的职能从集合本身转移到迭代器对象.迭代器定义了一个用于访问集合元素并记录当前元素的接口.不同的迭代器可以执行不同的策略. 例子 说了这么多,下面给大家展示一下类关系图. 上图中Client的右边是迭代器,左边是具体迭代的类型,在迭代器内部对具体需要迭代的类型进行了引用,还算不难理解吧,呵呵.其实,看起来是为了对具体类型进行解耦.好啦,下面给出具体的代码实现,简单的模拟了迭代器模式

《Python高性能编程》——1.2 将基本的元素组装到一起

1.2 将基本的元素组装到一起 仅理解计算机的基本组成部分并不足以理解高性能编程的问题.所有这些组件的互动与合作还会引入新的复杂度.本段将研究一些样本问题,描述理想的解决方案以及Python如何实现它们. 警告:本段可能看上去让人绝望--大多数问题似乎都证明Python并不适合解决性能问题.这不是真的,原因有两点.首先,在所有这些"高性能计算要素"中,我们忽视了一个至关重要的要素:开发者.原生Python在性能上欠缺的功能会被迅速开发出来.另外,我们会在本书中介绍各种模块和原理来帮助减

再议“生成全排列算法”

看了"白话算法(7) 生成全排列的几种思路(一)"和"白话算法(7) 生成全排列的几种思路(二) 康托展开".在此,将以前本人推导的全排列算法介绍一下,和广大的网友交流一下. 以例子说明,用0.1.2.3,四个数组成全排列. 首先可以知道,这四个数组成的全排列一共有4!=24个.那么给这24个全排列编号,分别为0.1.2--23.再给定一个算法,通过编号计算出一个全排列.本文的目的就是找到这样的算法. 把所有的全排列列举出来可以发现,0在末位的有6个,1在末位的有6