- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
如果您有 10 亿个数字和一百台计算机,找出这些数字的中位数的最佳方法是什么?
我的一个解决方案是:
如果我们有m1 < m2 < m3 ...
然后先合并Set1
和 Set2
在结果集中,我们可以丢弃所有低于 Set12
中位数的数字(合并)。所以在任何时候我们都有相同大小的集合。顺便说一句,这不能以并行方式完成。有什么想法吗?
最佳答案
啊,我的脑子刚开始运转,我现在有一个明智的建议。如果这是一次采访,可能为时已晚,但没关系:
机器 1 应称为“控制机器”,为了便于论证,它要么从所有数据开始,然后将其以相等的包裹发送到其他 99 台机器,要么数据开始在机器之间平均分配, 并且它将其数据的 1/99 发送给其他每个。分区不必相等,只需接近即可。
每台其他机器对其数据进行排序,并以有利于首先找到较低值的方式进行排序。因此,例如快速排序,总是首先对分区的较低部分进行排序[*]。它会尽快以递增的顺序将其数据写回控制机器(使用异步 IO 以继续排序,并且可能会启用 Nagle:进行一些实验)。
控制机器在数据到达时对数据执行 99 路合并,但丢弃合并的数据,只记录它看到的值的数量。它将中位数计算为十亿分之 1/2 和十亿分之一以上的平均值。
这会遇到“群中最慢”的问题。直到排序机器发送了每个小于中位数的值,该算法才能完成。很有可能其中一个这样的值在其数据包中非常高。因此,一旦数据的初始分区完成,估计的运行时间是对 1/99 的数据进行排序并将其发送回控制计算机的时间与 Controller 读取 1/2 数据的时间的组合. “组合”介于最大值和这些时间的总和之间,可能接近最大值。
我的直觉是,要通过网络发送数据比排序数据更快(更不用说仅选择中位数),它需要一个相当快的网络。如果可以假定网络是瞬时的,则可能会有更好的前景,例如,如果您有 100 个内核,可以平等地访问包含数据的 RAM。
由于网络 I/O 很可能是受限的,因此您可以使用一些技巧,至少对于返回控制机器的数据而言。例如,不是发送“1,2,3,.. 100”,也许分拣机可以发送一条消息,意思是“100 个值小于 101”。控制机器然后可以执行修改后的合并,在其中它找到所有这些最高范围值中的最小值,然后告诉所有分拣机器它是什么,以便它们可以 (a) 告诉控制机器如何许多值“计数”低于该值,并且 (b) 从该点恢复发送它们的排序数据。
更一般地,控制机器可以与 99 分选机一起玩一个聪明的挑战-响应猜谜游戏。
不过,这涉及到机器之间的往返,我的第一个更简单的版本避免了这种情况。我真的不知道如何盲目估计它们的相对性能,并且由于权衡取舍很复杂,我想有比我自己想到的任何解决方案更好的解决方案,假设这是一个真正的问题。
[*] 可用堆栈允许 - 如果您没有 O(N) 额外空间,您选择先执行哪一部分将受到限制。但是如果你有足够的额外空间,你可以随意选择,如果你没有足够的空间,你至少可以使用你所需要的东西来偷工减料,首先为前几个分区做小部分。
关于algorithm - 计算十亿个数字的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2571358/
基本上在 excel 中,我想要一个表格,就像下面右边给出的那个(我的数据规模比给出的例子大很多),它有每个主题的中位数,每个条件(例如 TADA、TADP、TPDA , TPDP)。理想情况下,我会
我有一个大小为5000 * 5000的矩阵,其90%的值为0。是否有现成的解决方案可用来计算排除“0”后该矩阵的均值,中位数? 一种粗制解决方案是将所有0更改为NA并使用 median(x, na.
这个问题已经有答案了: Mean per group in a data.frame [duplicate] (8 个回答) 已关闭 9 年前。 我有一个数据框,详细记录了客户花了多少钱,如下所示:
这是我的代码,用于打印所有职业的平均值和中位数。 occupation_lst = ['ALL OCCUPATIONS', 'MANAGEMENT', 'Chief executives', 'Gen
我的 csv 文件中有一个数据集,如下所示: teacher student student grade Jon marin
如何在 C 中不使用数组的情况下找到一组数字的平均值、中位数?问题不是找到平均值或中位数的方法,而是如果不允许使用数组,如何存储一组数字并对它们执行一些操作? 最佳答案 一个有趣的问题。 关键是找到一
我正在使用 SQL Server 2008 如果我有这样的表: Code Value ----------------------- 4 240 4 299 4 21
我正在尝试获取表中一组值的平均值、中位数、众数和范围。我能够得到平均值,但中位数、范围和众数我得到了错误的值。 下面是我为上述概念尝试过的代码。 Select CDS.[Commodity_S
我正在尝试获取表中一组值的平均值、中位数、众数和范围。我能够得到平均值,但中位数、范围和众数我得到了错误的值。 下面是我为上述概念尝试过的代码。 Select CDS.[Commodity_S
我需要从输入文件中查找平均值、中位数、众数和范围。 [input file has the numbers{60,75,53,49,92,71}] 我不知道如何打印范围内的计算结果或计算众数。 这很糟
这个问题已经有答案了: Division of integers in Java [duplicate] (7 个回答) 已关闭 7 年前。 public static double calcMed
当我输入 1,2,3 时我的中位数计算有问题我的中位数是 = 44 我不知道为什么 double wynik = 0; string x1 = textBox1.Text; string[] tab
我的中位数 3 实现在这里运行不正常。我必须为媒体随机选择 3 个数字,这是我的代码,请帮助我。 #include"stdafx.h" #include #include using namespa
我有一个文件,其中有如下几秒钟的数字: 0.01033 0.003797 0.02648 0.007583 0.007491 0.028038 0.012794 0.00524 0.019655 0.
是否有任何函数(作为数学库的一部分)可以计算 mean 、中位数、众数和范围来自一组数字。 最佳答案 是的,似乎确实有第三个库(Java Math 中没有)。出现的两个是: http://opsres
我目前正在尝试从具有两个条件的一系列数据中提取中位数。本质上相当于下面的 AVERAGEIFS(),我工作得很好。 AVERAGEIFS(): =AVERAGEIFS(Analysis!$F:$F,A
我有一个 pandas 数据框,看起来像这样: 给定行中的每个值要么是相同的数字,要么是 NaN。我想计算数据框中所有两列组合的平均值、中位数和获取计数,其中两列都不是 NaN。 例如,上述数据帧的结
我有以下数据: [4.1, 4.1, 4.1, 4.2, 4.3, 4.3, 4.4, 4.5, 4.6, 4.6, 4.8, 4.9, 5.1, 5.1, 5.2, 5.2, 5.3, 5.3, 5
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
一组整数作为输入。您必须返回该集合的子集,以便该子集的均值 - 中位数最大。 示例 1 输入 {1,2,3,4} 输出 {1,2,4} 例子2 输入 {1,2,2,3,3} 输出 {2,2,3} 最佳
我是一名优秀的程序员,十分优秀!