算法导论第九章:中位数和顺序统计学

在一个有n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。中位数是出现在i=(n+1)/2处(下中位)或i=(n+1)/2+1处(上中位)。

 

9.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:这个解法的问题在于,如何记住与最小元素比较过的元素集合,难道要整棵树建出来。这样的话这个算法没有什么实际意义。

 

 

9.2以期望线性时间做选择

 一般的选择问题比找最小值的简单问题更难,两种问题的渐进运行时间却是相同的都是Θ(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<k

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<xk)<1/2且∑(xi>xk)<=1/2。

a)论证如果wi=1/n,那么x1,x2,x3...,xn的中位数即是带权中位数。

假设集合xi的中位数为xk,满足xi<xk的元素个数和xi>xk的元素个数都约为n/2。所以满足带权中位数的定义。

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<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<k),那么由于∑(i=1~l)wi<1/2,那么pl+1是一个更优的点。如果选取pm(m>k),那么由于∑(i=m~l)wi<1/2,那么pm-1是一个更优的点。

 

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)就是最佳位置。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值