中位数选择算法 - 它是否找到绝对中位数,或“中位数中位数”接近绝对中位数?

时间:2012-01-25 14:27:31

标签: algorithm selection median clrs

CLRS第3版第9.3节“最坏情况线性时间的选择”讨论了“选择”算法(有时称为Blum,Floyd,Pratt,Rivest和Tarjan的BFPRT算法),用于查找a的中位数在最坏的情况下在O(n)时间列出。当我试图在白板上运行样品时,我有点困惑。我知道在每次调用“Select”时都可以消除一定数量的元素(我读过30%被淘汰而70%需要再次检查),我感到困惑的是阵列的哪个部分可以消除,即如果阵列可视化为高度为5且宽度为n / 5的矩阵,那么被消除的元素在哪个象限中?我原本以为它是两个对角相邻的象限,但现在我认为它只是一个象限,取决于中位数的中位数(见步骤5,6和7 here)。

所以我去维基百科看看是否有一个快速的解释,分析比CLRS少(为了在我跳回CLRS进行分析之前理解算法)。我来到this,特别是'最后,“中位数的中位数”被选为枢轴。“根据维基百科中描述的声音,“选择”找不到真正的中位数而是一个中位数足够的元素,以便为快速排序选择一个支点。

那么“选择”在真实中位数方面做了什么,它是如何做到的?通过所有这一点想到的短语是“部分层次结构”,据我所知,这是“选择”工作的原因,但是通过什么逻辑可以消除列表中的元素作为基于此部分层次结构的中位数?

1 个答案:

答案 0 :(得分:3)

找到绝对中位数。

正如你所说,“选择”并没有找到真正的中位数,而是找到一个足够中位数的元素,以便为快速排序选择一个支点。特别是它的中位数足够大于它保证在每次迭代时至少减少30%的数据集。不幸的是,这也是一项昂贵的操作。

关键思想是中位数的中位数小于或等于中位数小于或等于5的每5个元素中的3个。因此,对于5个组的一半,它每5个元素中的3个小于或等于3个,因此该组的至少30%小于或等于它。因此它占据了最大的70%的数据集。

同样,它是数据集中最小的70%。

这可以保证您避免快速选择的潜在缺陷,即选择具有极值的枢轴点。

如果您希望将效率和最差情况结合起来,可以将其与快速选择相结合。例如4轮quickselect接下来的一轮,然后是4轮quickselect等等。昂贵的BFPRT轮保证O(n),而快速选择平均速度很快。通过推迟你的第一轮BFPRT直到你完成几轮quickselect,你可以使额外的运行时间比平均快速选择多出几个百分点。 (最糟糕的情况是成本上升了很多,但我们预计不会遇到这种情况。)