理解代码的中位数中位数

时间:2017-01-14 13:48:16

标签: c++ median-of-medians

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

  1. 我应该添加if语句,如果n低于一定数量,我们应该对数组进行排序并返回v [k]?
  2. 在第4行中,为什么我们通过将变量增加4来创建变量?据我所知,我们必须将它除以5,以便有一定数量的小数组
  3. 6行负责的“for loop”是什么?是否将主阵列拆分成较小的阵列,我们想要排序然后创建一个中位数阵列?为什么有交换功能以及为什么我们将它分成if和else条件?
  4. 为什么我们在
  5. 之前调用相同的函数行后删除中位数数组
  6. 25行中for循环的目的是什么,33中也是如此,并且在38中交换?
  7. 如果对此有任何帮助,我真的非常感激。

1 个答案:

答案 0 :(得分:2)

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