Самый быстрый способ проверить, содержит ли список ноль - PullRequest
3 голосов
/ 24 декабря 2011

При подготовке ответа на Секретный Санта - Генерация «действительных» перестановок Я столкнулся с необходимостью проверить, содержит ли список ноль.Мне интересно, какой самый быстрый способ сделать это в 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}

1 Ответ

2 голосов
/ 24 декабря 2011

Похоже, что часть замедления с 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}
...