在一个有n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。中位数是出现在i=(n+1)/2处(下中位)或i=(n+1)/2+1处(上中位)。
在一个有n个元素的集合中,要做多少次比较才能确定其最小元素呢?可以很容易地给出n-1这个上界:依次查看集合中的每个元素,并记录比较过程中的最小元素。
n-1也是这个问题的比较次数下界:对于任意一个确定最小值的算法,可以把它看做是在各元素之间进行的一场锦标赛,每次比较都是锦标赛中的一场比赛,两个元素中较小的一方获胜,有一点很关键,就是除了最终获胜者之外,每个元素都少输掉至少一场比赛;而至少有n-1场比赛。
同时找出最大值可最小值
我们可以独立地找出最大值和最小值,各用n-1次比较。事实上,至多3(n/2)次比较久足以同时找到最小值和最大值。做法是记录比较过程遇到的最小值和最大值。我们不是将每一个输入元素与当前的最大值和最小值进行比较。而是成对地处理元素。先将一对输入元素互相比较,然后把较大的与当前最大值进行比较,较小的与当前最小值进行比较,因此每对元素需要比较3次。
练习:
9.1-1证明:在最坏情况下,利用n+lgn-2次比较,即可以找到n个元素中的第2小的元素。
参考答案:(从网上找的答案)
将n个元素进行两两比较,将较大的淘汰,较小的留下。这样通过n/2次比较就剩下n/2个元素。再进行第二轮;如此往复直到得出最小的元素。这个过程可以用一棵二叉树来描述。那么第二小的元素只有在于最小元素的比较才会被淘汰。最小的元素进行过的元素有lgn-1个。于是在进行lgn-2次比较就可以得出第二小的元素。
PS:这个解法的问题在于,如何记住与最小元素比较过的元素集合,难道要整棵树建出来。这样的话这个算法没有什么实际意义。
一般的选择问题比找最小值的简单问题更难,两种问题的渐进运行时间却是相同的都是Θ(n)。本节介绍一种解决选择问题的分治算法,即RANDOMIZED-SELECT算法,以第七章的快速排序算法为模型,如同在排序中一样,对输入的数组进行递归划分,但和快速排序不同的是,快速排序会递归处理划分的两边,而RANDOMIZED-SELECT只处理划分的一边。RANDOMIZED-SELECT的期望时间为Θ(n)。
RANDOMIZED-SELECT(A,p,r,i)
1 if p=r
2 then return A[p]
3 q<--RANDOMIZED-PARTITION(A,p,r)
4 k<--q-p+1
5 if i=k
6 then return A[q]
7 elseif i 8 then return RANDOMIZED-SELECT(A,p,q-1,i) 9 else return RANDOMIZED-SELECT(A,q+1,r,i-k) RANDOMIZED-PARTITION就是快速排序算法中的partition过程。 RANDOMIZED-SELECT的最坏运行时间是n2。期望运行时间为n。 思考题: 9-2带权中位数 对分别具有正的权重w1,w2,...,wn且∑wi=1的n个不同元素x1,x2,...,xn,带权中位数是满足如下条件的元素xk:∑(xi a)论证如果wi=1/n,那么x1,x2,x3...,xn的中位数即是带权中位数。 假设集合xi的中位数为xk,满足xi b)说明如何通过排序求出n个元素的带权中位数。 对xi进行排序,依照排序后的顺序依次计算前k个权重的和。当第一次计算到某个位置发现权重和大于或等于1/2时,xk就为带权中位数。 c)说明如何利用一的中位数算法,来求带权中位数。 以RANDOMIZED-SELECT算法为例,我们以对xi的快速排序算法为基础,区别在于,我们不是寻找第k大的数,而是寻找使∑(xi<=xk)>=m满足的最小k位置。算法可以从RANDOMIZED-SELECT修改而来。 WRANDOMIZED-SELECT(A,p,r,m) 1 if p=r 2 then return A[p] 3 q<--RANDOMIZED-PARTITION(A,p,r) 4 计算A[p...q]的权重和m' 5 if m=m' 6 then return A[q] 7 elseif m 8 then return WRANDOMIZED-SELECT(A,p,q-1,m) 9 else return WRANDOMIZED-SELECT(A,q+1,r,m'-m) 邮局位置问题:已知n个点p1,p2,...,pn即它们相练习的权重w1,w2,...,wn。我们希望能找到一点p(不一定是输入点中的一个),使得何时∑wiD(p,pi)最小,此处D(a,b)表示点a与b之间的距离。 d)证明带权中位数是一维邮局位置问题的最佳解决方案,其中所有的点都是实数。一维意味着d(a,b)=|a-b|。 首先证明p点必然可以是输入点中的一点,采用反证法:假设p是pk和pk+1之间的一点。如果∑(i=1~k)wi>=1/2,那么pk点将是一个更优(或同优)的点,pk+1将是一个更优的点。在再证明带权中位数就是最优点,同样采用反证法:假设pk是带权中位点,那么对于如果选取pl(l e)找出二维邮局位置问题的最佳解答。其中所有的点都是(x,y)坐标对,并且点a(x1,y1)和b(x2,y2)之间的距离是Manhanttan距离:d(a,b) = |x1-x2|+|y1-y2|。 只要分别从x1,x2,...,xn和y1,y2,...,yn找出带权中位数xi,yj。那么点(xi,yj)就是最佳位置。