Wolfram mathematica Mathematica中的置换[]运行时

Wolfram mathematica Mathematica中的置换[]运行时,wolfram-mathematica,permutation,combinatorics,Wolfram Mathematica,Permutation,Combinatorics,它似乎运行得非常快,即使是相对较大的(10号)集。有人能告诉我他们特定算法的大θ运行时间吗?我在文档中找不到它。我第一次尝试回答这个问题时有严重缺陷。由于大多数内部算法都没有发布限制行为,因此我决定直接对其进行度量。我测量了计算随机值列表的排列所需的时间,并计算了每种长度1000个排列的平均值和标准偏差。由于所需的时间,我使用了10个元素的最大长度,而置换仅适用于长度不超过12的工作列表。我在日志图上的结果: 平均值为黑线,一个标准偏差由平均值周围的填充区域表示。从长度5开始,它大致笔直,直到

它似乎运行得非常快,即使是相对较大的(10号)集。有人能告诉我他们特定算法的大θ运行时间吗?我在文档中找不到它。

我第一次尝试回答这个问题时有严重缺陷。由于大多数内部算法都没有发布限制行为,因此我决定直接对其进行度量。我测量了计算随机值列表的排列所需的时间,并计算了每种长度1000个排列的平均值和标准偏差。由于所需的时间,我使用了10个元素的最大长度,而
置换
仅适用于长度不超过12的工作列表。我在日志图上的结果:


平均值为黑线,一个标准偏差由平均值周围的填充区域表示。从长度5开始,它大致笔直,直到10,可以检测到轻微的曲线。我怀疑它是O(n!),但对于7或8以下的长度,这真的不重要。即使长度为10的排列也给出了一个令人尊敬的平均值,为0.241+/-0.012 s。

您能否提供一个例子,说明WRI在文档中放置任何Mathematica算法的大O、ω、θ运行时间的位置?不,但对于某些函数,它们确实解释了底层实现(这个函数调用一个使用散列映射的C库,等等。)考虑到生成的集合的数量,这个函数可能比O(n!)运行得快吗?或者您感兴趣的是它比O(n!)慢多少?(它需要做额外的比较,因为它不会返回与
{1,2,2}
相同的
{1,2,3}
)你能用
n!
除以对数标度吗?这样我们就可以看到它比对数标度慢多少?我刚刚注意到你的两个轴都是对数轴。你只是想用对数垂直轴,对吧?否则指数会向上弯曲。假设
n!
复杂度,这应该会给出所有k,它对
k>=5
所做的。因此复杂性实际上接近
n!
。它为
k<5
提供了更大的计时,但这可能是由于其他影响。
表[{k,First@Timing[做[Permutations@Range[k] ,{10*(10!/k!)}];]},{k,5,10}]
@Szabolcs,改为log plot。当你说除以
n!
时,你是指除以时间还是
n!
本身?第二,我不明白你为什么用这种方式改变
排列的数量,你能解释吗?我的假设是运行时间与n成正比!(因为总共生成了n个置换)或更慢(因为列表中有相等的元素时需要额外的比较)。因此,我想知道的是算法比n!慢多少。因此,理想情况下,我会取n=1..10的若干计时,并将每个计时除以n!。如果它确实在n!时间内运行,我们会得到每个计时的相同值。但这是不切实际的,因为n=10的时间预计比n=5的时间慢10!/5!~=30000倍。