§ 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)]