3

シークレットサンタへの回答を準備しているときに、 「有効な」順列を生成しているときに、リストにゼロが含まれているかどうかを確認する必要がありました。Mathematica 7でこれを行う最も速い方法は、非負の整数の短いリストに重点を置いて、何であるか疑問に思っています。

使用Min[list] === 0は私が見つけた最速で、MemberQまたはよりも高速ですが、以下の操作FreeQと同等のより高速な方法があることを望んでいます。BitXor

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

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

1 に答える 1

2

質問で使用されている速度低下の一部は、0 === Minの自動コンパイルへの干渉であるようですMap。これらの手順を分離すると、ほぼ2倍の改善が得られます。

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

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

結果を(0 | 1)として受け入れ、リストを1つとして処理する場合は、次を使用できます。

Unitize[Times @@ BitXor[r, #] & /@ p]; // Timing
{0.156、Null}
于 2011-12-24T03:27:51.350 に答える