|
Zamyi 发表于 2011-8-31 18:36 
因为“没有最好,只有更好”。
Excel VBA本身是有能力界限的吧。
也许还会有比现在的代码更好、更快的代码出现。但总应该有一个极限吧。
某个世界纪录出现之后,也许就永远无人超越了(在相同电脑环境下。)
下面我的代码,已经超越了你的记录。
或许这已经是VBA数组对不定值任意组合通过循环遍历所有组合解的极限了……呵呵。
http://club.excelhome.net/thread-1033055-1-1.html
组合计算的核心代码如下:- Function Combin_Do(m&, n&) 'kagawa
- Dim i&, j&, k&, r&
- tms = Timer
-
- ReDim a&(1 To n)
- If n = m Then For j = 2 To n: a(j) = j: Next
-
- i = 0: j = 1: k = 0
- Do
- ' r = r + 1
- i = i + 1: a(j) = i
-
- If j = n Then
- k = k + 1
- If i = m Then If j = 1 Then Exit Do Else j = j - 1: i = a(j)
- ElseIf i = m - n + j Then
- k = k + 1
- If j = 1 Then Exit Do Else j = j - 1: i = a(j)
- Else
- j = j + 1
- End If
- Loop
- Combin_Do = Format(Timer - tms, "0.000s") & " kagawa Do Combin(" & m & "," & n & ")= " & k
-
- End Function
复制代码 速度更快的原因主要有以下几个:
1、 直接使用 i 变量作为元素位置,直接使用 j 变量作为组合位置
而a(j) = i 仅作为必须的状态记录,通过变量的有效使用大大提高了计算速度。
2. a(j) = i 每次循环对a(j)只有一次通过变量的直接赋值,比a(j) = a(j) + 1 这种方式要更快一些。
平时感觉不到,但组合遍历循环次数是一个很大的数值时,显然有提速效果。
3. 增加了 If i = m - n + j Then 这样的提前进入下一组循环的算法……
结果当然是有效地减少了总循环次数……效果明显。
…………呵呵
单纯进行组合运算显然不足以显示实用性。
因此把原始数据元素有效组合起来也存在一个效率的问题。
这个问题我承认你的Mid置换方法是最最高效的……我几年前就看到了你的相似用法,
因此在这个方面我的代码方法和你的代码方法是大同小异,殊途同归了……。
呵呵,详细请到我的帖子里去看一下附件吧。
|
|