转自:mosfet.isu.edu/classes/cs385f10/resources/Introduction%20to%20Algorithms(Instructor's%20Manual).pdf
(CLRS 9.3-7)
Describe an O(n) algorithm that, given a set S of n distinct numbers
and a positive integer k ≤ n, determines the k numbers in S that are closest to the
median of S .
Solution:
Note that the k numbers in S that are closest to the median are among the k smallest numbers on either side of the partition (around the median).
注意到数组中最接近中位数的k个数字是两边分区中最小的k个数。
We first use linear time selection to find the median.
首先使用线性选择算法找到中位数。
Then we compute an array B of absolute differences between the ith element in S and the median, B[i] = |S [i] − median|.
之后计算数字B,该数组记录数组S中每个元素到中位数距离的绝对值。B[i] = |S [i] − median|.
The k elements closest to the median are the k smallest elements in B.
最接近中位数的k个元素是B中最小的k个元素。
We use linear time selection to find the k-th smallest element in B.
使用线性选择算法找到数组B中第k个最小元素。
The first k elements in the resulting partition of B correspond to the k numbers in S closest to the median.
数组B经过选择算法处理后,在结果划分的前k个元素就对应数组S中距离中位数最近的k个数。
The algorithm takes O(n) time as we use linear time selection exactly two times and traverse the n numbers in S once.
使用两次线性时间选择算法找中位数和第k个数,一次遍历数组S中的n个数,该算法时间复杂度为O(n)。
1 get the median of S
2 compute the distence of S to the median, store in B
3 get the kth order statistics in B. the first k elements in partition of B is the output