|
本帖最后由 灰袍法师 于 2012-1-20 20:58 编辑
更新:增加输出到文本文件的功能,从此不怕内存不够,工作表填充缓慢了,不过存入文本文件本身也是相当慢的,大概每秒10万个组合吧。
优先下载这个最终版本.rar
(65.84 KB, 下载次数: 3529)
此帖受到下面链接的刺激,从而诞生。
我設計的組合算法★20取10,0.53秒 by linyancheng
http://club.excelhome.net/redire ... 4366084&ptid=642637
当然,很久以前,彭希仁版主写过一个一模一样算法的VBA,在这里
[讨论]排列组合之最优算法 by 彭希仁
http://club.excelhome.net/thread-278319-1-1.html
那么,我为何还要花时间写一个算法是跟上面两位一模一样的VBA呢
原因就是貌似很多人看不懂过于简略的代码。
所以就在极度无聊之下,有了这么一个大量注释版本的VBA(按我私心猜度,即使没有注释应该也比较好懂)。
附件包括 略有修改的 linyancheng,彭希仁,和我自己的代码,方便读者不用分头下载了。
其实三个Excel文件的VBA算法都一样,速度也都差不多,没有什么好比较的。主要还是清晰易懂方面有差别而已。
我个人认为,应该都不是最快速的算法,毕竟进位的调整也是耗用了一些计算时间,但是每秒钟400万组合应该也足够快了。(2.13Ghz Core Duo)
以上速度是仅仅生成组合的速度,并没有存储或者进一步对组合进行后续计算。
另外附件linyancheng朋友的代码,是所有组合结果都存储到内存数组的速度,所以不能直接跟我的以及彭希仁版主的相比,那样会不公平了。
最后,三个附件的一点小差异是
彭希仁版主的VBA是把结果存储到硬盘文件,输出结果是最快的。
linyancheng的VBA是存储到内存数组,没办法直接查看,当然,他在上面连接自己的完整代码,是有存储到硬盘文件的,而且是写成一个过程,方便其他程序直接调用,有兴趣的朋友自行去研读吧
我的代码可以在内存足够的时候存储到内存数组,在工作表行数足够的时候存储到工作表(速度很慢,100万行大概2分钟)
可以靠修改工作表的单元格来改变是否输出结果。
更新了linyancheng最新的更快的代码,我自己的代码则改善了可读性。
补充了一个自动检测系统可用内存,以及Excel工作表可用行数(65535 or 1048575)的版本,不用再分2003/2007版本了。
并且在自动检测的版本上,增加一个指定输出的组合数字和值的功能,不在和值范围的组合将不会出现
如:可以求 1-33 选 6, 和值是 90-100 的组合
[ 本帖最后由 灰袍法师 于 2011-3-5 19:59 编辑 ]
|
评分
-
3
查看全部评分
-
|