(一)组合问题
组合是一个基本的数学问题,本程序的目标是输出从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.
代码实现:
package huawei
import (
"fmt"
"time"
)
/*
【排列组合问题:n个数中取m个】
*/
func Test10Base() {
nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
m := 5
timeStart := time.Now()
n := len(nums)
indexs := zuheResult(n, m)
result := findNumsByIndexs(nums, indexs)
timeEnd := time.Now()
fmt.Println("count:", len(result))
fmt.Println("result:", result)
fmt.Println("time consume:", timeEnd.Sub(timeStart))
//结果是否正确
rightCount := mathZuhe(n, m)
if rightCount == len(result) {
fmt.Println("结果正确")
} else {
fmt.Println("结果错误,正确结果是:", rightCount)
}
}
//组合算法(从nums中