本文实例讲述了Go语言实现的排列组合问题。分享给大家供大家参考,具体如下:
(一)组合问题
组合是一个基本的数学问题,本程序的目标是输出从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个结果,耗时约10ms.
代码实现:
注:n个元素中取m个一共有多少种取法可直接通过数学公式计算得出,即:
通过此公式可以简单的验证一下上述程序的结果是否正确。
(二)排列问题
从n个数中取出m个进行排列,其实就是组合算法之后,对选中的m个数进行全排列。而全排列的问题在之前的文章中已经讨论过了。
代码实现:
希望本文所述对大家Go语言程序设计有所帮助。