检查列表中是否包含零的最快方法

3
在准备回答Secret Santa - Generating 'valid' permutations时,我遇到了检查列表是否包含零的需要。 我想知道在Mathematica 7中实现这一点的最快方法,重点是对非负整数的短列表进行操作。
使用Min[list] === 0是我发现的最快的方法,比MemberQFreeQ更快,但我希望有一种更快的方法,与下面的BitXor操作相当:
r = Range@9;
p = Permutations@r;

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

2

看起来,0 === Min 在问题中的减速部分是由于干扰了 Map 的自动编译。分离这些步骤可以提供近两倍的改进:

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

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

如果我接受结果为(0|1),并将列表作为一个整体进行处理,则可以使用以下内容:

Unitize[Times @@ BitXor[r, #] & /@ p]; // Timing
{0.156, Null}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接