【问题标题】:Median of medians understanding the code中位数的中位数理解代码
【发布时间】:2017-01-14 13:48:16
【问题描述】:

我在这里找到了一个用 c++ 实现的算法 https://gist.github.com/andlima/1774060 但我不明白几行的目的以及它们是如何工作的,

  1. 我是否应该添加一个 if 语句,如果 n 低于一定数量,我们应该对数组进行排序并返回 v[k]?
  2. 在第 4 行中,为什么我们通过将变量增加 4 来创建变量?我知道我们必须将它除以 5 才能拥有一定数量的小数组
  3. 6 行中的“for 循环”负责什么?是否将主数组拆分为我们想要排序的较小数组,然后创建一个中位数数组?为什么有一个交换函数,为什么我们把它分成 if 和 else 条件?
  4. 为什么我们在之前调用相同的函数行之后删除中位数数组
  5. 第 25 行中的 for 循环和第 33 行中的 this 以及第 38 行中的交换的目的是什么?

如果能提供任何帮助,我将不胜感激。

【问题讨论】:

    标签: c++ median-of-medians


    【解决方案1】:
    1. 这是一种优化。一个实现可以做到这一点,但它不必这样做。
    2. 将除以五的结果加四。这是整数除法的常见技巧:如果您想将除以 N 的结果四舍五入,请在除法前添加 N-1
    3. 第 6 行的循环负责迭代数组的五个元素块。 if 条件检查块是否有五个元素。内部的for 循环执行选择排序,交换元素以将中值放置在索引w[2]
    4. 我们会在递归调用结束后立即删除 medians,因为算法的其余部分不需要它。
    5. 第 25 行的循环将 pivot 移动到数组的末尾位置。

    【讨论】:

    • 最后一部分的工作与快速排序相似?谢谢,现在我更清楚了
    • @Jędrzej 是的,这很像快速排序。如果您不再寻求有关此问题的更多帮助,请考虑通过单击旁边的复选标记来接受答案。这将使其他网站访问者知道您对问题的答案感到满意,并为您赢得 StackOverflow 上的新徽章。
    猜你喜欢
    • 2012-01-18
    • 2019-06-05
    • 2011-11-26
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 1970-01-01
    • 2020-02-22
    相关资源
    最近更新 更多