中位数与n分位数

来源:互联网 发布:小众旅游 知乎 编辑:程序博客网 时间:2024/05/03 20:21

第9章中位数和顺序统计量

其实《算法导论》第三版第9章,已经讲了不少有关中位数和顺序统计量的知识。

尤其是9.3的那个线性时间内确定中位数(其实可以拓展到任意一个n分位数)的算法,简直不要太屌。

额。我自认为我没可能讲的比《算法导论》还要好,而且,又不便直接复制粘贴。所以那部分东西我就不讲了,这篇博文就以中位数的拓展为主。


电梯调度

记得《编程之美》有一个电梯调度问题,大意就是每天,一堆人从1楼做电梯,然后每层楼都停,感觉很烦,如果能够在一个合适的地方停一下,然后,没到的人几个人向上走,停过了人向下走。。。然后对于一堆人的电梯在一层就已经确定的目标楼层数据,应该选择在哪一层停才能使,向上走的人走的总层数和向下走的人的总层数最小?

比如 有三个人 他们目标楼层分别是(3,5,9),那么如果你在第3层停,结果到第5层和第9层的就需要向上走,3-3 + 5-3 + 9-3 = 8层。代价是8层,

如果是在第5层停,那么向下走的话,结果是第3层的那个要向下走 5-3 + 5-5 + 9-5 = 6层。 代价6层,结果比原来的8层代价少,所以停在第5层更好。


分析:其实这道题目是算法导论9.3-9的特例。这个东西其实想一想就知道是中位数。。。我们求个中位数就妥了。。。注意比如(3,9,9)这些数据的中位数是9,不是3,也不是 (9 +3)/2 = 6,而是9。这是统计学的基本知识点,注意。(2,4,6,9)的中位数,我们考虑成(4+6)/2 = 5.

由于本题的东西是电梯,楼层有限,所以可以考虑用计数排序,特别简单,直接找中位数就可以了。


脑洞大开,一档

为何是中位数? 

这么一问,这个东西就蛋疼了。

这个东西我们假设最好是停在min层,然后min层对应的代价是price_m,如果至少应该满足以下的两个性质。

1.如果我们停在min + 1层,那么总代价应该大于等于price_m,。

2.向下一层 总代价应该也是大于等于price_m。

假设,在第min层时,有a个人他们的楼层数小于 min, 有b个人他们的楼层数等于min, 有c个人他们的楼层数大于min

那么结果就是 向上走一层的代价就是 price_m + (a+b)*1 - c*1 >=price_m     ---------->a+b >= c    --------> c <= (a+b+c) / 2

同理向下走一层代价就是 price_m + (c+b)*1 - a*1 >= price_m          ----> b+c >= a     -----------> a <= (a+b+c)/2

所以,中位数所在的地方,满足这个性质。

对于(2,4,6,9)这类数据,中位数是5,在4,6之间都是可以的。而且在[4,6]之间移动时,向上移动满足a+b == c, 向下移动满足 b+c == a成立。

所以中位数的5和其他解的值一样,都是最优解。

如果类似于 (2,4,4,8)这种数据,中位数是4,向上移动和向下移动都会有问题,所以中位数是本例子的唯一最优解。

我们可以看出,无论什么情况,中位数,总能给出最优的解答。所以本题可以用中位数来做。


脑洞大开,二档

我们来考虑一下这个题的变种,比如向下走的人他们的代价小一点。向上的人代价大一点。
假定,向下走一层,代价为1,向上走一层,代价为k,k>1.
那么很明显,我们可以通过上面的一档的考虑,给出解答,解答应该是,从小到大排序,第n * k/ ( 1 + k) 人所在的楼层,如果除不尽的话,那么我们考虑上下去整,
比较一下上面和下面的两个值就可以了。一档只是二档的特殊情况。

脑洞大开,三挡

既然是三挡,我们就应该来点狠的。
比如,这个电梯可以在两个地方停。
那么代价最小的地方应该是哪两个楼层?

假定,最优解是在 x, y,令 y > x, 那么令,x以下的有a个人, x和y之间(不包含x, y)的有 b 个人,y以上的有 c个人
那么 可以断定, a 基本和b  b基本和c相等,所以。我们可以考虑, x, 在这这些数据的下三分点,y在x数据的上三分点。

如果有3个地方可以停下。
那么 我们令它们是 x, y, z, 那么 x <  y < z,   然后依次给出 a, b, c, d 然后, 分析有 a==b, b == c, c==d, 所有就是四分点。
所以。。
最后如果有n个地方可以停下,我们就有 n分位点就可以了。

  
----------------------------下面是题主作死-----------------------

脑洞大开,四挡

貌似草帽路飞都没有开过四档吧。。。
好吧,我的脑洞已经根本合不上了。
因为我回头看了一下
上面我们分析了一维的情况,我看到了《算法导论》9.3-9,发现它竟然可以是二维的,虽然
那个题可以转换成一维来做,但如果这个东西是 真・二维 捏?


二维的情况,一堆二维的点,我们应该怎么弄。
首先,我们必须考虑二维下距离的定义,
如果 我们按
1.曼哈顿距离定义
点(x1,y1) 和 点(x2,y2)的距离定义成 (|x1 - x2|+|y1 - y2|)(算法导论 33。4-3)。如果是这么定义的话,
这个东西就妥了。因为,我们这样就可以把x维和y维分开考虑。。然后令 x为 那一堆数中,在,x这个维度上的中位数。
然后y是 y这个维度上的中位数。
如果我们作死按
2.欧式距离定义:
点(x1,y1) 和 点(x2,y2)的距离定义成 sqrt [(x1 - x2)*(x1-x2) + (y1 - y2)*(y1 - y2)]
sqrt表示开平方。
那么。。。。

其实我们仍然可以厚着脸皮,假定最优点是 (a, b)
那么总的距离就可以表示成。
其实,我们可以把这个总距离函数给求出来,然后考虑求个梯度什么的,然后,梯度下降加退火算法。
生成一堆种子点,然后搞一搞,总结,感觉特别高大上。。

3.欧式距离平方定义:
点(x1,y1) 和 点(x2,y2)的距离定义成 [(x1 - x2)*(x1-x2) + (y1 - y2)*(y1 - y2)],
如果是这样定义,那么这个东西就比较简单,因为可以直接求导,然后,发现只有一个极值点(最小值点)在x,y方向上均取平均数就行了。


3.5欧式距离平方定义与k-means算法:

额,主要是近段时间在看k-means算法,就是那个吴恩达(Adrew ng)在网易公开课的那个。
k-means算法大概是用来分类的。它的优化目标和上面的2很像。。只是他是多个点的优化,比如我要在某个城镇,建3个小学方便就近入学,那应该肿么办。
把每一个居民区看成一个点(或几个点,调整权重),然后,k-means搞一搞。。。对于距离可以给出一个心里价位的函数。比如同2一样,用总距离的平方的和定义。
然后通过k-means收敛几下,就可以大概给出参考点了。。。当然实际规划中肯定会考虑更多东西,这只是给一个参考。




 








0 0