Algorithm 最小化数组中每个元素与整数K之间的差值之和

Algorithm 最小化数组中每个元素与整数K之间的差值之和,algorithm,math,optimization,minimum,Algorithm,Math,Optimization,Minimum,给定一个由N个非负整数组成的数组A,求一个整数k,使每个元素与k的差值之和最小。 i、 e.求和(abs(A[i]-k)),1您可以以数字线上的点的形式表示数组中的所有值 例如,位于数字线上的点可以如下所示: _____________________四,八,七,十五, 根据问题的定义,我们可以说,数线上与所有点等距的点应该给出正确的答案 所以你要做的就是找到所有数字的平均值。将答案返回为更接近平均值的整数。例如,对于2.66返回3,对于2.2返回2,对于2.5返回2或3中的任何一个 运行时间:

给定一个由N个非负整数组成的数组A,求一个整数k,使每个元素与k的差值之和最小。

i、 e.求和(abs(A[i]-k)),1您可以以数字线上的点的形式表示数组中的所有值

例如,位于数字线上的点可以如下所示:

_____________________四,八,七,十五,

根据问题的定义,我们可以说,数线上与所有点等距的点应该给出正确的答案

所以你要做的就是找到所有数字的平均值。将答案返回为更接近平均值的整数。例如,对于2.66返回3,对于2.2返回2,对于2.5返回2或3中的任何一个


运行时间:
O(N)
计算数字的平均值。

您可以以数字线上的点的形式表示数组中的所有值

例如,位于数字线上的点可以如下所示:

_____________________四,八,七,十五,

根据问题的定义,我们可以说,数线上与所有点等距的点应该给出正确的答案

所以你要做的就是找到所有数字的平均值。将答案返回为更接近平均值的整数。例如,对于2.66返回3,对于2.2返回2,对于2.5返回2或3中的任何一个


运行时间:
O(N)
计算数字的平均值。

给定一组数字a_1,…,a_N,已知(例如)中值使绝对偏差之和最小化

由于您有一个整数数组,因此:

(a) N是奇数,中值是整数m,您将k设置为

(b) N是偶数,中位数是两个整数a和b的平均值。在这种情况下,a和b之间的所有数字使绝对偏差之和最小化。因此,您可以选择k作为a、b或中间的任何整数(如果有)

例如,如果数字为1,3,4,6,9,则中值为4,将k设置为。
如果数字为4,7,12,15,则中值为(7+12)/2,您可以将k设置为7到12之间的任意数字。例如,k=7给出总偏差(7-4)+(7-7)+(12-7)+(15-7)=16,k=12给出总偏差(12-4)+(12-7)+(12-12)+(15-12)=16。

给定一组数字a_1,…,a_N,已知(见例)中位数使绝对偏差之和最小

由于您有一个整数数组,因此:

(a) N是奇数,中值是整数m,您将k设置为

(b) N是偶数,中位数是两个整数a和b的平均值。在这种情况下,a和b之间的所有数字使绝对偏差之和最小化。因此,您可以选择k作为a、b或中间的任何整数(如果有)

例如,如果数字为1,3,4,6,9,则中值为4,将k设置为。
如果数字为4,7,12,15,则中值为(7+12)/2,您可以将k设置为7到12之间的任意数字。例如,k=7给出总偏差(7-4)+(7-7)+(12-7)+(15-7)=16,k=12给出总偏差(12-4)+(12-7)+(12-12)+(15-12)=16。

我基本上得到了中值。为了最小化成本函数,采用导数

要找到成本函数的最小值,请找到导数为零的位置。代价函数不是处处连续可微的,而是分段可微的。设S=A和si的排序数为第i个最大数

案例1。如果m是奇数 楼层(m/2)ai小于中间带,楼层(m/2)ai大于中间带。选择x=中值,则给出-m/2+0+m/2=0

案例2。如果m是偶数 对于si和s(i+1)之间的值,导数为零;i=m/2。然后可以选择任意数字k,以便

简单例子 123450

拣选2:1+0+2+48=51

拣选4:3+2+0+46=51

拣选3:2+1+1+47=51

因此任意选取s(m/2)


对于更好的算法,O(NlogN)您可以对数字进行排序,然后根据需要从上面选择(m+1)/2或m/2,或者您可以使用可以计算O(N)中答案的。为了最小化成本函数,采用导数

要找到成本函数的最小值,请找到导数为零的位置。代价函数不是处处连续可微的,而是分段可微的。设S=A和si的排序数为第i个最大数

案例1。如果m是奇数 楼层(m/2)ai小于中间带,楼层(m/2)ai大于中间带。选择x=中值,则给出-m/2+0+m/2=0

案例2。如果m是偶数 对于si和s(i+1)之间的值,导数为零;i=m/2。然后可以选择任意数字k,以便

简单例子 123450

拣选2:1+0+2+48=51

拣选4:3+2+0+46=51

拣选3:2+1+1+47=51

因此任意选取s(m/2)


对于更好的算法,O(NlogN)您可以对数字进行排序,然后根据需要从上面选择(m+1)/2或m/2,或者您可以使用可以用O(N)计算答案的。你有什么推论来证明这一点吗?如果我没记错的话,平均值最小化了平方差之和,中位数最小化了绝对差之和。但是如果
k
被限制为一个整数,这可能会改变问题。你自己说中位数使绝对差之和最小化。在这个问题中,我们希望最小化绝对差之和,并且不需要从列表中选择元素。因此,我们可以轻松地取平均值,而不是取中位数,期望得到正确的答案。@invi
low = minimumValueInArray(A);
high= maximumValueInArray(A);
ans = Infinite;
for (k = low; k <= high; k++) {
    temp = 0;
    for (i = 1; i <= N; i++) {
        temp += abs(A[i] - K);
    }
    ans = min(ans, temp);
}
return ans;