去语言实现的排列组合问题实例(n个数中取个)

  

本文实例讲述了去语言实现的排列组合问题。分享给大家供大家参考,具体如下:

  

<强>(一)组合问题

  

组合是一个基本的数学问题,本程序的目标是输出从n个元素中取m个的所有组合。

  

例如从[1,2,3]中取出2个数,一共有3中组合:[1,2],[1,3],[2、3]。(组合不考虑顺序,即[1,2]和[2,1]属同一个组合)

  

本程序的思路(来自网上其他大神):

  

(1)创建有n个元素数组,数组元素的值为1表示选中,为0则没选中。
  (2)初始化,将数组前m个元素置1,表示第一个组合为前m个数。
  (3)从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
  (4)当某次循环没有找到“10”组合时,说明得到了最后一个组合,循环结束。

  

例如求5中选3的组合:

  

1 1 1 0 0//1、2、3
  1 1 0 1 0//1、2、4
  1 0 1 1 0//1,3,4
  0 1 1 1 0//2、3、4
  1 1 0 0 1//1、2、5
  1 0 1 0 1//1、3、5
  0 1 1 0 1//2、3、5
  1 0 0 1 1//1、4、5
  0 1 0 1 1//2、4、5
  0 0 1 1 1//3、4、5

  

效率情况:20个元素中取5个,共15504个结果,耗时约10 ms。

  

代码实现:
  代码如下:包华为
  导入(
  ,,“fmt”
  ,,“时间”
  )
/*
  【排列组合问题:n个数中取m个】
  */
  func Test10Base () {
  ,,num:=int [] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  ,,m:=5
  ,,timeStart:=time.Now ()
  ,,n:=len (num)
  ,,指标:=zuheResult (n, m)
  ,,结果:=findNumsByIndexs (num指标)
  ,,timeEnd:=time.Now ()
  ,,fmt。Println(“数:len(结果))
  ,,fmt。Println(“结果:”,结果)
  ,,fmt。Println(“时间消耗:timeEnd.Sub (timeStart))
  ,,//结果是否正确
  ,,rightCount:=mathZuhe (n, m)
  ,,如果rightCount==len(结果){
  ,,,,,,fmt.Println(“结果正确”)
  ,,其他}{
  ,,,,,,fmt。Println(“结果错误,正确结果是:”,rightCount)
  ,,}
  }
//组合算法(从num中取出m个数)
  func zuheResult (int, int) int [] [] {
  ,,如果m & lt;1 | | m比;n {
  ,,,,,,fmt。Println(“非法参数。参数m必须介于1和len (num)”)。
  ,,,,,,返回int [] [] {}
  ,,}
  ,,//保存最终结果的数组,总数直接通过数学公式计算
  ,,结果:=使(int [] [] 0 mathZuhe (n, m))
  ,,//保存每一个组合的索引的数组,1表示选中,0表示未选中
  ,,指标:=(int [], n)
  ,,我:=0;我& lt;n;我+ + {
  ,,,,,,如果我& lt;m {
  ,,,,,,,,,,指标[我]=1
  ,,,,,,其他}{
  ,,,,,,,,,,指标[我]=0
  ,,,,,,}
  ,,}
  ,,//第一个结果
  ,,结果=遭受(因此,指标)
  ,,为{
  ,,,,,,发现:=false
  ,,,,,,//每次循环将第一次出现的1 0改为0 1,同时将左侧的1移动到最左侧
  ,,,,,,我:=0;我& lt;n - 1;我+ + {
  ,,,,,,,,,,如果索引(我)==1,,指标(i + 1)==0 {
  ,,,,,,,,,,,,,,找到=true
  ,,,,,,,,,,,,,,[我]索引,索引(i + 1)=0, 1
  ,,,,,,,,,,,,,,如果我在1 {
  ,,,,,,,,,,,,,,,,,,moveOneToLeft(指标[我])
  ,,,,,,,,,,,,,,}
  ,,,,,,,,,,,,,,结果=遭受(因此,指标)
  ,,,,,,,,,,,,,,打破
  ,,,,,,,,,,}
  ,,,,,,}
  ,,,,,,//本次循环没有找1到0,说明已经取到了最后一种情况
  ,,,,,,如果!找到{
  ,,,,,,,,,,打破
  ,,,,,,}
  ,,}
  ,,返回结果
  }
//将避署复制后添加到加勒比海盗中,返回新的数组
  func遭受(arr int[][],避署int []) int [] [] {
  ,,newEle:=(int [], len(避署))
  ,,复制(newEle避署)
  ,,arr=append (arr newEle)
  ,,返回arr
  }
  func moveOneToLeft (leftNums int []) {
  ,,//计算有几个1
  ,,总结:=0
  ,,我:=0;我& lt;len (leftNums);我+ + {
  ,,,,,,null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

去语言实现的排列组合问题实例(n个数中取个)