我正面临挑战,我有三个数组,每个数组仅包含数字。
我有一个函数watcher.Path = @"c:\";
,该函数接收2个参数,一个数组数组和一个数字。该数字是我希望通过对每个数组的一个或多个数字求和而得到的总和,例如:
如果我有2个数组get_sum
并且第二个参数是[[1,2,3], [1,2,3]]
该函数将返回总计为4的组合数。在这种情况下:
4
因此该函数将重新调整int 1+3 = 4
2+2 = 4
3+1 = 4
我在下面编写了该函数,并且效果很好,但是我正在寻找一种提高效率的方法。目前,如果我有少于6个数组,它将可以工作;如果我有一百个数组,则希望它能够工作。 有任何可以帮助我的数组函数吗?
这是代码:
3
如果JavaScript中有一个函数,那也会很好。
谢谢
答案 0 :(得分:5)
这个想法是为所有数组的所有元素创建一个笛卡尔积,然后计算给出期望总和的行。
在 JavaScript ES6 中,这种想法可以这样实现:
const simpleCartesian = (arr1, arr2) => [].concat( ...arr1.map( el1 => arr2.map( el2 => [].concat( el1, el2 ) ) ) );
const fullCartesian = (arr1, arr2, ...arrN) => (arr2 ? fullCartesian(simpleCartesian(arr1, arr2), ...arrN) : arr1);
const reduceSum = (a, b) => a + b;
const getSum = (arr, sum) => fullCartesian(...arr).reduce((prev, currArr) => prev += currArr.reduce(reduceSum) == sum ? 1 : 0, 0);
函数simpleCartesian
,fullCartesian
和reduceSum
是getSum
函数的辅助。
使用中:
getSum( [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6]], 9)
// Returned value: 25
在 PHP 中,这种想法可以像这样实现:
function cartesian_product($arrays) {
$cartesian_product = [[]];
foreach ($arrays as $key => $arr) {
$appendArr = [];
foreach ($cartesian_product as $product) {
foreach ($arr as $item) {
$product[$key] = $item;
$appendArr[] = $product;
}
}
$cartesian_product = $appendArr;
}
return $cartesian_product;
}
function get_sum($arrays, $sum) {
$counter = 0;
$cartesian_product = cartesian_product($arrays);
foreach ($cartesian_product as $row) {
if ($sum == array_sum($row)) {
$counter++;
}
}
return $counter;
}
函数cartesian_product
是get_sum
函数的辅助。
使用中:
get_sum( [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 7]], 7);
// Returned value: 15
我们需要知道,当我们使用多个数组或某些非常大的数组时,使用笛卡尔积会消耗大量内存来创建完整的数组。
如果我们假设表格的元素是非负数,则可以通过删除所有等于或大于 sum参数的元素来优化该算法在创建笛卡尔积之前,请从输入表中输入em 。
如果我们假设表的元素为正,则可以通过删除等于或大于 sum参数的所有元素减去输入计数来优化该算法创建笛卡尔积之前,先从输入表中获取数组。
特别感谢@rsp和@SergiySokolenko回答了有关在 JavaScript 和 PHP 中实现笛卡尔积的答案。 em>。