【问题标题】:Median select algorithm - does it find the absolute median, or a "median of medians" close to the absolute median?中位数选择算法 - 它是否找到绝对中位数,或接近绝对中位数的“中位数中位数”?
【发布时间】:2012-02-18 17:30:56
【问题描述】:

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

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

那么“选择”在真正的中位数方面做了什么,它是如何做到的?通过所有这一切想到的短语是“部分层次结构”,据我所知,这就是“选择”起作用的原因,但是通过什么逻辑,您可以根据这个部分层次结构将列表中的元素从中间值中消除?

【问题讨论】:

  • BFPRT 基本上是快速选择,改进了枢轴选择。使用快速选择,您选择了一个枢轴不知何故,分区,然后在上半部分或下半部分递归调用。 BFPRT 通过在每个递归步骤使用中位数的中值作为枢轴来修改它。

标签: algorithm selection median clrs


【解决方案1】:

它找到绝对中位数。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-05-04
    • 2021-08-17
    • 2017-03-15
    • 2013-10-25
    • 2019-02-26
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    相关资源
    最近更新 更多