javascript - 解释算法背后的数学原理

标签 javascript algorithm math

给定一个排序的整数数组 a,找到这样一个整数 x 使得值

abs(a[0] - x) + abs(a[1] - x) + ... + abs(a[a.length - 1] - x) 是尽可能小的(这里abs表示绝对值)。 如果有多个可能的答案,输出最小的一个。

例子

对于 a = [2, 4, 7],输出应该是 absoluteValuesSumMinimization(a) = 4.

我能够通过暴力破解来解决这个问题,但后来我发现了这个

function absoluteValuesSumMinimization(A) {
    return A[Math.ceil(A.length/2)-1];
}

希望了解其工作原理/原因。

最佳答案

让我们分解一下。

A.length/2 返回长度的一半,用于查找数组的中间位置。对于偶数长度的数组,这将位于中间的右侧。对于奇数长度的数组,它将位于中间。

Math.ceil(A.length/2) 必要时向上舍入,因此 5 的数组的中间将是 2.5 -> 3。这使得奇数长度的数组减一.

Math.ceil(A.length/2)-1 下降一个索引。这纠正了所有数组的差一错误。

这个解决方案的意思是,在一个长度为偶数的数组中,您要查找的值总是在中间的左边。在奇数长度的数组中,它总是是中间项。

这在直觉上是有道理的。从每个项目中减去数组中的中间项目将始终导致最低总和。在偶数长度的数组中,两个中心项的总和总是相同,因此最小的数字将位于中心的左侧。

要查看此内容,请从此暴力解决方案中删除 console.log 注释并尝试几个数组:

function absoluteValuesSumMinimization(ints) {
  const vals = [];

  ints.forEach(int => {
    const sum = ints.reduce((accum, next) => {
      return accum + Math.abs(next  - int);
    }, 0);

    vals.push(sum);
  });

  // console.log(vals);
  const lowest = Math.min(...vals);
  return ints[vals.indexOf(lowest)];
}

关于javascript - 解释算法背后的数学原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44379453/

相关文章:

javascript - 如何合并来自不同输入值的数组。?

javascript - jQuery,按类名显示所有元素

algorithm - 为什么不把父指针保存在 "B+ Tree",方便树向上遍历?

android - 位置跟踪 - 带计步器和 WIFI 的西格玛点卡尔曼滤波器

algorithm - Tinyurl 风格的唯一代码 : potential algorithm to prevent collisions

javascript - JQuery:基于列值的表行显示/隐藏

javascript - 从 html 中获取 SVG 以备后用

ruby - 算法:在给定单词列表的情况下解决填字游戏

C++如何在不使用排序的情况下打印大小为n的数组中的最小数字

c# - 双淘汰括号算法