§ Sum of absolute differences of an array
- We are given an array
a[:]
and we are asked to compute the sum of differences ∑i=1n∑j=i+1n∣a[i]−a[j]∣. - To compute this efficiently, first sort
a[:]
into a sorted array s[:]
. For simplicity, say we have N = 4
. - Now see that if we write down the values for
N=4
, we will see:
D =
|s[1] - s[2]| + |s[1] - s[3]| + |s[1] - s[4]| +
|s[2] - s[3]| + |s[2] - s[4]| +
|s[3] - s[4]|
-
i < j
implies s[i] < s[j]
as s
is sorted. So each of the terms (s[i] - s[j]|)
is negative. We thus flip the terms, giving:
D =
(s[2] - s[1]) + (s[3] - s[1]) + (s[4] - s[1]) +
(s[3] - s[2]) + (s[4] - s[2]) +
(s[4] - s[3])
- Note that
s[1]
is always negative, so it will have coefficient -4
on grouping. - See that
s[2]
was positive in the grouping (1, 2)
, and was negative in the groupings (2, 3)
and (2, 4)
. So 2
will have a coefficient +1*(2-1) -1*(4 - 2)
. - Similarly,
s[3]
was positive in the grouping (1, 3)
and (2, 3)
and was negative in the grouping (3, 4)
. - In general,
s[i]
will be positive when paired with [1, 2, ..i-1, i)
and negative when paired with (i, i+1, i+2, \dots n]
. So s[i]
will contribute a coefficient of +1*(i-1) - 1*(n-i)
[using the formula that for intervals [l, r)
and (l, r]
the number of elements is (r-l)
]