ДЛЯ ВЕДУЩИЙ:проверку на наличие возможной комбинации значений в массиве, сумма которых равна заданному значению
Вопрос, для которого это предполагается дубликат, не затрагивает ряд вопросов.
- Этот вопрос не о том, как операторы работают сами по себе, но как они функционируют в алгоритме, то почему эти операторы в этой точке.
- Этот вопрос также включает в себя побитное сравнение '&' оператор, который
другой вопрос не адресуется вообще. - Центральное понимание к ответу при условии, что путем присвоения
combinationsCount = 1 << listSize
один превращает итератора «I» в петле в векторе битов, которые могут быть испытаны в отношении конкретного «J», чтобы определить, , если оно должно быть включенных в сумму для тестирования.
Это решение проблемы изменения монет, я думаю. Код работает, насколько мне известно, но я не понимаю, как последний, если проверка:
if (i & (1 << j)) {
combinationSum += arr[j];
}
работы в этом алгоритме (см. Ниже) Я столкнулся с этим, работая над учебником. Я бы очень признателен за любое объяснение того, как работает эта часть кода.
UPDATE:
Чтобы быть ясно, я понять ЧТО операторы делают, то есть немного сдвигая и побитовое сложение. Я хочу знать, как они работают в рамках алгоритма.
possibleCombinationSumN(arr, n) {
if (arr.indexOf(n) >= 0) {
return true;
}
if (arr[0] > n) {
return false;
}
if (arr[arr.length - 1] > n) {
arr.pop();
return possibleCombinationSumN(arr, n);
}
var listSize = arr.length, combinationsCount = (1 << listSize)
for (var i = 1; i < combinationsCount; i++) {
var combinationSum = 0;
for (var j = 0; j < listSize; j++) {
if (i & (1 << j)) {
combinationSum += arr[j];
}
}
if (n === combinationSum) {
return true;
}
}
return false;
};
Небольшое пояснение: «бит-мутное сравнение» и «оператор» - это не оператор сравнения, это побитовый «и» оператор. Он очень часто используется для извлечения одного бита, как и здесь (поскольку он копирует бит в '1', но обнуляет биты на' 0'); в этом случае он называется «маскировка», а «шаблон» для извлечения («1 << j' в этом случае) называется« маской ». Здесь нет явного сравнения, и ни одно из них не выполняется с помощью '&': неявное сравнение выполняется с помощью JavaScript, 'if (i & (1 << j) == true)', и оно работает, потому что JS считает, что '0' значение фальши и любое другое число - правдивое. – Amadan
Благодарим вас за разъяснение, и теперь термин бит-маска становится немного более понятным. –