算法导论-第9章-中位数和顺序统计量


一个包含 n n n 个元素的集合中的第 i i i顺序统计量指集合中的第 i i i 小的元素。 最小值是第 1 1 1 个顺序统计量( i = 1 i= 1 i=1), 最大值是第 n n n 个顺序统计量( i = n i = n i=n)。

9.1节将讨论从集合中找出最小值和最大值的问题。9.2节将分析一个实用的算法,它在元素互异的条件下可以达到 O ( n ) \Omicron(n) O(n) 的期望运行时间。9.3节将给出一个更具有理论意义的算法,最坏情况下的运行时间为 O ( n ) \Omicron(n) O(n)

9.1 最小值和最大值

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

MINIMUMMAXIMUM都要进行 n − 1 n-1 n1 次比较。

同时找到最大和最小值

  • 分别独立地找到最小值和最大值,这各需要 n − 1 n-1 n1 次比较,共需 2 n − 2 2n-2 2n2 次比较。

  • 事实上,只需要最多 3 ⌊ n / 2 ⌋ 3 \lfloor n/2 \rfloor 3n/2 次比较就可以同时找到最小值和最大值。首先,将一对输入元素相互进行比较,然后把较小的与当前最小值比较,把较大的与当前最大值进行比较。这样,每两个元素共需比较3次。

如果 n n n 是奇数,那么总共进行 3 ⌊ n / 2 ⌋ 3 \lfloor n/2 \rfloor 3n/2 次比较。如果 n n n 是偶数,则是先进行一次初始比较,然后进行 3 ( n − 2 ) / 2 3(n-2)/2 3(n2)/2 次比较,共 3 n / 2 − 2 3n/2-2 3n/22 次比较。因此,无论哪种情况,总的比较次数最多为 3 ⌊ n / 2 ⌋ 3 \lfloor n/2 \rfloor 3n/2

9.2 期望为线性时间的选择算法

需要先了解快速排序和随机化快速排序。

RANDOMIZED-SELECT以快速排序为模型。与快速排序不同的是,快速排序会递归处理划分的两边,而RANDOMIZED-SELECT只处理划分的一边。快速排序的期望运行时间为 Θ ( n log ⁡ n ) \Theta(n \log n) Θ(nlogn),而RANDOMIZED-SELECT的期望运行时间为 Θ ( n ) \Theta(n) Θ(n)

RANDOMIZED-SELECT(A, p, r, i)
    if p == r
        return A[p]  // 1 ≤ i ≤ r - p + 1 when p == r means that i = 1
    q = RANDOMIZED-PARTITION(A, p, r)
    k = q - p + 1
    if i == k
        return A[q]  // the pivot value is the answer
    elseif i < k
        return RANDOMIZED-SELECT(A, p, q - 1, i)
    else return RANDOMIZED-SELECT(A, q + 1, r, i - k)

9.3 最坏情况为线性时间的选择算法

提取自chap9

提取自chap9

提取自chap9

提取自chap9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值