算法导论中的一道题

设X[1,...,n]和Y[1,...,n]为两个数组,每个都包含n个已排好序的数。给出一个求数组X和Y中所有2n个元素的中位数的、O(lgn)时间的算法。

1.首先找到X和Y的中位数xm,ym,O(1)的时间。

2.因此可以用xm,ym将X,Y进行等分:X[1,2,...,n/2-1] ,xm,X[n/2+1,n/2+2,...,n] 和Y[1,2,...,n/2-1] ,ym,Y[n/2+1,n/2+2,...,n] .

3.我们可以对xm和ym进行考虑:若ym>xm,那么在xm的左边都会<ym,因此可以用二分法在xm的右边找到等于ym或第一个大于ym的数xc,同理可以对xm在ym的右边找到一个开始小于或等于ym的数yc,则可以统计xc与yc之间的距离(这个要在找xc和yc的同时,记录两者到xm、ym的距离,这样就不会将算法时间上升到O(n)),然后用O(1)的时间进行选择得到2n个数的中位数。

 

感觉是对的,但还没有验证过。

下面是另外一题:

解法:

就是这么道题,首先该怎么选择呢?当然我们可以列一个式子:对每一个油井有x,y座标,这里假设x座标为东西方向,则y座标为南北方向。因此,对于x没有信息可言,则只要考虑y座标就行了。对于n个油井可以表示成Y=(y1,y2,...,yn).这里设主干道的y座标为c,则可以求一个最小表达式:
f(c) = (y1-c).^2+(y2-c).^2 + ... + (yn-c).^2
只要求得f(c)的最小时的c,问题就解决了。
那么,我们有什么解决过如此的方法吗?嗯,好像可以用最小二乘法了。或者用求导的办法去解决,但要知道这个二次曲线是不是在导数为0处为最小值呢?当然可以求一下,这里可以求得c=(y1+y2+...+yn)/n.感觉这是求得一个平均数,将n=2时直接导出这是中位数。ok,中位数。那么是不是呢? 怎么证明?其实,可以这样连接:这里看图最左边的两个点,那么这两个点到在两个点之间的直线的距离是永远不变的,即为一个常量(不能越过两个点中的任何一个,否则就不是常数了)。因此,可以为每两个点配对,则,只要直线落在所有配对两点之间,就是一条使得点到直线的距离最短。那么我们还可以将此转换成求中位数的问题,因为,只要直线穿过中位数的那个点,就能保证所有配对点都在直线的两边。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章