3

在准备Secret Santa 的答案 - 生成“有效”排列时,我遇到了检查列表是否包含零的需要。我想知道在Mathematica 7中最快的方法是什么,重点是非负整数的简短列表。

usingMin[list] === 0是我发现的最快的,比MemberQor更快FreeQ,但我希望有一种更快的方法,与BitXor下面的操作相当:

r = Range@9;
p = Permutations@r;

BitXor[r, #] & /@ p; // Timing
0 === Min[BitXor[r, #]] & /@ p; // Timing
{0.062,空}
{0.452,空}
4

1 回答 1

2

似乎0 === Min问题中使用的部分减速是干扰Map. 将这些步骤分开提供了近乎双重的改进:

r = Range@9;
p = Permutations@r;

Min@# === 0 & /@ (BitXor[r, #] & /@ p); // Timing
{0.296,空}

如果我接受结果为 (0|1) 并且如果我将列表作为一个处理,那么我可以使用它:

Unitize[Times @@ BitXor[r, #] & /@ p]; // Timing
{0.156,空}
于 2011-12-24T03:27:51.350 回答