爱疯 发表于 2012-11-11 21:55
谢谢群子老师!
下去再慢慢理解了
对15楼VBA数组组合算法的举例说明:
我的VBA组合算法思路是这样的:
假定从m个元素中抽取不重复的n个值,下面举例m=6,n=3
一. 定义一个数组 Redim a(1 to n), 存放1-n各个组合数位的状态结果
那么第一次就是 1,2,3
二. 末位递增,即1,2,3 → 1,2,4 → 1,2,5 → 1,2,6 → 1,2,7
三. 每次检查末位,当末位值大于m时(即1,2,7),进行如下操作。
1. 倒序检查各数位
a. 如果该数位可以递增则停止。 如 1,2,7 或 1,3,7 或 1,4,7 时
b. 如果该数位已经不可以递增时则即继续检查前一数位。 如 1,5,7 时下一步不可递增为1,6,6
2. 可递增数位+1
3. 可递增数位以后顺序递增。结果例子如下:
1,2,7 → 1,3,4 (中间第2位 2可递增到3)
1,4,7 → 1,5,6 (中间第2位 4可递增到5)
2,5,7 → 3,4,5 (中间第2位 5已经不可递增到6,但首位2可递增到3)
3,5,7 → 4,5,6 (中间第2位 5已经不可递增到6,但首位3可递增到4)
4. 最后检查首位如果已经到最大值 (如4,5,6进位后变成4,5,7检查处理最后变成5,6,7时),则退出循环结束组合计算。
四. for……next 循环执行第三步。
以上反复进行,就能高效地遍历得到所有组合解了。
这个算法,一般情况下就是直接进行末位递增,仅仅当末位到底时才需要检查处理,算法效率就高了。
|