【问题标题】:Find median of a large integer set using MapReduce使用 MapReduce 查找大整数集的中位数
【发布时间】:2011-10-21 13:05:04
【问题描述】:

是否有在 MapReduce 框架上运行的快速算法以从巨大的整数集中找到中位数?

【问题讨论】:

标签: mapreduce


【解决方案1】:

我会这样做。这是顺序快速选择的一种并行版本。 (某些 map/reduce 工具可能无法让您轻松地完成任务……)

从输入集中任意选择一小块。按顺序排序。我们将并行使用这些作为一大堆支点。将此数组称为pivots,并将其大小设为k

如下执行map/reduce:对于输入集中的每个值x,二分查找x相对于pivots的位置;打电话给这个职位bucket(x)。这是0k 之间的整数。 reduce步骤是统计每个bucket中的元素个数;将bucket[b] 定义为xbucket(x) = b 的编号。

中位数必须在“中位数桶”中。挑选出该中位数桶中的所有值,并使用传统的顺序选择算法找到具有正确索引的元素。

【讨论】:

  • 假设我正确理解了这个算法,它有几个问题。首先,您应该选择统计上显着数量的枢轴。其次,不能保证中位数会在“中位数桶”中。例如,如果您有 3 个 reducer,并且您选择枢轴作为排序后的第一个和第二个数字,那么您的所有数字将最终出现在第三个 reducer 中,显然不是中间值 reducer,它里面什么都没有。第三,如果将桶 i 中的所有内容都发送到 reducer i,则无法保证它可以放入内存中。
  • “你应该选择统计上显着数量的枢轴”,我的意思是你应该从比减速器数量更多的样本中选择你的枢轴,即使你决定有几个枢轴.这可能已隐含在您的算法中。但是枢轴的数量不应该是减速器数量的函数,而是你的内存和输入大小的函数。我想通过“中位数桶”,您可能意味着中位数所在的桶,您可以从桶数中计算出。即使这样,第三个反对意见仍然存在。
  • “我想通过“中位数桶”,您可能指的是中位数所在的桶,您可以从桶数中计算出“正确,显然;为什么我们还需要计数步骤? “但是枢轴的数量不应该是减速器数量的函数,而是你的记忆和输入大小的函数。”枢轴的数量在这里是完全灵活的;我不是故意暗示其他的。
  • “从输入集中选择一个小的任意块,大小与可用机器的数量大致相同......我们将把它们用作一大堆枢轴”这直接说否则。无论如何,你的“中间桶”怎么知道它是中间桶?
  • ...在我们得到桶数之后,我们可以计算出来,不是吗?
猜你喜欢
  • 2011-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2012-02-26
  • 2015-07-04
  • 2020-04-03
  • 1970-01-01
相关资源
最近更新 更多