【发布时间】:2015-09-26 19:05:52
【问题描述】:
考虑一个列表[1,1,1,...,1,0,0,...,0](零和一的任意列表)。我们想要这个数组中所有可能的排列,会有binomial(l,k) 排列(l 代表列表的长度,k 代表列表中的数量)。
现在,我已经测试了三种不同的算法来生成所有可能的排列,一种使用循环函数,一种计算
通过计算区间数[1,...,1,0,0,...,0]的排列
到[0,0,...0,1,1,...,1](因为这可以看作是一个二进制数区间),以及使用字典顺序计算排列的一个。
到目前为止,前两种方法在排列为 大约32. 词典编排技术仍然很有效(只需几毫秒即可完成)。
我的问题是,专门针对 julia,这是计算的最佳方法
我之前描述的排列?我对组合学了解不多,但我认为下降基准是从binomial(l,l/2)@
【问题讨论】:
-
“最佳方式”将取决于您的问题的约束(列表的最大大小是多少?
l和k的值是否均匀分布?)以及您的考虑做到最好(最简单、最快或最直接?针对使用的总内存或 CPU 时间进行了优化?)。听起来您已经有了一个很好的解决方案。为什么不满意? -
其实
k和l的值是任意的。灵感是由费米子组成的物理系统。碰巧描述它的适当数学基础是(Fock 基础)[en.wikipedia.org/wiki/Fock_state],其维度为binomial(l,k),并且基础的成员是我给出的带有零和一的列表的一些排列。如果我没记错的话,一个很好的例子是l>>k,这个想法是有一个足够大的基础来模拟一个像样的物理系统(在fortran中,我做了类似~10^4基础维度的事情,或者速度较慢)。 -
另一方面,我希望算法足够快以生成整个基础,并且如果可能的话,尽可能节省使用的内存。最后一个灵感是学习新的组合算法并朝这个方向挖掘,这是我想要真正探索的方向。
标签: algorithm julia combinatorics