|
其实楼主你的算法并没有比那一个更快,不过也没有更慢。
因为你的VBA是存储可选数值的阵列编号,即 Arr(1) = 1, Arr(2)=0, Arr(3)=1 Arr(4) = 1 ....
而彭希仁的VBA是存储可选数值的输出结果即 "1+3+4" ,如果去掉计算这一个string的语句,那么他的combin(20,10)只需0.08秒。
可见主要速度差别是计算数字会比计算一个string型快而已,
如果你最后还是要生成string的结果,那么其实速度差不多。
你和彭希仁的算法应该是一样的,都是每个选择的数字对应一个阵列的下标,然后只加减这个下标就可以取出不同的阵列组合,所以计算速度也不会有什么差别,最多就是相差数倍,排除输出结果的不同格式,可以认为是无差别。
不过你输出结果到excel worksheet的方法不对。
For X = 1 To 組合數
For Y = 1 To 選數
Cells(X, Y) = 組合陣列(Y, X)
Next Y
Next X
这一段是非常慢的,应该直接计算出 range(cells(1,1), cells(X,Y) ).value = 組合陣列
最后,以后讨论问题应该上传附件,而不是贴代码,更不要用中文名字,你的中文代码在我的简体Excel里面全显示是红字。
彭希仁的代码计算combin(29,10) 不生成组合的string,20030010 个解! 耗时6.57秒
生成组合的string则是 20030010 个解! 耗时52.46秒
彭希仁的代码计算combin(30,10) 不生成组合的string,30045015 个解! 耗时9.81秒
生成组合的string则是 30045015 个解! 耗时77.03秒
你的代码计算combin(29,10)是 23.15088秒-共20030010筆
你的代码计算combin(30,10)会导致死机,原因是内存不够了。你应该把on error resume next去掉,或者增加内存不够时的错误处理,不然一旦组合数过多,就必定死机的啦。
可以考虑一下阵列用integer型,虽然计算慢一些,但是内存少用一半吖! 而且根本没有人会去列举 combin(32767,2)的嘛
甚至byte也是可以考虑的。。。。。。combin(255,4)也已经是很大的数字了
[ 本帖最后由 灰袍法师 于 2010-10-30 06:47 编辑 ] |
|