算法导论读书笔记(9)

算法导论读书笔记(9)

选择问题

在一个由 n 个元素组成的集合中,第 i顺序统计量 (order statistic)是该集合中第 i 小的元素。例如,在一组元素所组成的集合中, 最小值 是第 1 个顺序统计量( i = 1 ), 最大值 是第 n 个顺序统计量( i = n )。而 中位数 (median)是它所在集合的“中点元素”。像这样从一个由 n 个不一样数值构成的集合中选择其第 i 个顺序统计量的问题,能够形式化地定义为 选择问题 (selection problem):html

输入: 一个包含 n 个(不一样的)数的集合 A 和一个数 i ,1 <= i <= n
输出: 元素 xA ,它刚好大于 A 中其余的 i - 1个元素。
java

最小值和最大值

MINIMUM(A)
1 min = A[1]
2 for i = 2 to A.length
3     if min > A[i]
4         min = A[i]
5 return min
MAXIMUM(A)
1 max = A[1]
2 for i = 2 to A.length
3     if max < A[i]
4         max = A[i]
5 reutrn max

对于上面两个过程来讲,只要比较 n - 1次就能找出最大值/最小值。算法

随机选择算法

通常选择问题看起来要比找最小值的简单选择问题更难,但两种问题的渐近运行时间倒是相同的:都是 Θ ( n )。这里介绍一种解决选择问题的分治算法,即 RANDOMIZED-SELECT 算法。该算法利用了以前介绍的 RANDOMIZED-PARTITION 过程。sql

RANDOMIZED-SELECT(A, p, r, i)
1  if p == r
2      return A[p]
3  q = RANDOMIZED-PARTITION(A, p, r)
4  k = q - p + 1
5  if i == k    // the pivot value is the answer
6      return A[k]
7  elseif i < k
8      return RANDOMIZED-SELECT(A, p, q - 1, i)
9  else
10     return RANDOMIZED-SELECT(A, q + 1, r, i - k)

随机选择算法的最坏状况运行时间为 Θ ( n2 )。数组

最坏状况线性时间的选择

如今来看一个最坏状况运行时间为 Θ ( n )的选择算法 SELECT 。像 RANDOMIZED-SELECT 同样, SELECT 经过对输入数组的递归划分来找出所求元素。可是,该算法的基本思想是要保证对数组的划分是个好的划分。 SELECT 采用了取自快速排序的肯定性划分算法 PARTITION ,并作了修改,把划分主元元素做为其参数。bash

算法 SELECT 经过执行下列步骤来肯定一个有 n > 1个元素的输入数组中的第 i 小的元素。ide

  1. 将输入数组的 n 个元素划分红 FLOOR(n / 5) 组,每组5个元素,且至多只有一个组由剩下的 n mod 5个元素组成。
  2. 寻找 CEIL(n / 5) 个组中每一组的中位数。首先对每组中的元素(至多为5个)进行插入排序,而后从排序过的序列中选出中位数。
  3. 对第 2 步中找出的 CEIL(n / 5) 个中位数,递归调用 SELECT 以找出其中位数 x
  4. 利用修改过的 PARTITION 过程,按中位数的中位数 x 对输入数组进行划分。让 k 比划分低区的元素数目多1,因此 x 是第 k 小的元素,而且有 n - k 个元素在划分的高区。
  5. 若是 i = k ,则返回 x 。不然,若是 i < k ,则在低区递归调用 SELECT 以找出第 i 小的元素,若是 i > k ,则在高区找出第 i - k 个最小元素。
相关文章
相关标签/搜索