- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
CLRS 第 3 版第 9.3 节“最坏情况线性时间的选择”讨论了“选择”算法(由于 Blum、Floyd、Pratt、Rivest 和 Tarjan,有时称为 BFPRT 算法)用于查找 a 的中值在最坏的情况下在 O(n) 时间内列出。当我试图在白板上运行示例时,我有点困惑。我知道每次调用“选择”时都可以消除一定数量的元素(我读过 30% 被消除,而 70% 需要再次检查),我感到困惑的是数组的哪一部分可以消除,即如果数组被可视化为一个高度为 5,宽度为 n/5 的矩阵,那么被消除的元素位于哪个或哪些象限?我最初认为它是两个对角相邻的象限,但现在我认为它只是一个象限,具体取决于中位数的中位数是多少(请参阅步骤 5、6 和 7 here)。
所以我去维基百科看看有没有比CLRS分析更少的快速解释(为了在我跳回CLRS分析之前理解算法)。我来了this ,特别是“最后,选择“中位数的中位数”作为枢轴。”从维基百科的描述来看,“选择”并没有找到真正的中位数,而是找到了一个足够中位数的元素,以便为快速排序选择一个枢轴。
那么“选择”在真实中位数方面做了什么,它是如何做到的?通过所有这些想到的短语是“部分层次结构”,据我所知,这是“选择”起作用的原因,但是根据这个部分层次结构,您可以根据什么逻辑从列表中消除元素作为中值?
最佳答案
它找到绝对中位数。
正如您所说,“选择”并未找到真正的中值,而是找到一个足够中值的元素,以便为快速排序选择一个基准。特别是它的中值足够大,它是保证在每次迭代中至少丢弃 30% 的数据集。不幸的是,这也是一项昂贵的操作。
关键思想是每5个元素中位数小于等于3个中位数的中位数小于等于3个。因此,对于 5 个一组的一半,每 5 个元素中有 3 个小于或等于 3,因此至少有 30% 的集合小于或等于它。所以它在数据集中最大的 70%。
同样是在最小的70%的数据集中。
这保证您可以避免 quickselect 的潜在陷阱,即选择具有极值的枢轴点。
如果您希望将效率和最坏情况结合起来,您可以将其与快速选择结合起来。例如 4 轮快速选择,然后是 1 轮快速选择,然后是 4 轮快速选择,等等。昂贵的 BFPRT 轮保证 O(n)
,而平均而言快速选择会很快。通过推迟第一轮 BFPRT 直到完成几轮快速选择,您可以使额外的运行时间仅比快速选择平均多几个百分点。 (最坏的情况成本会增加很多,但我们预计不会遇到这种情况。)
关于algorithm - 中位数选择算法 - 它找到绝对中位数,还是接近绝对中位数的 "median of medians"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9004284/
我已经在 python 中编写了这个中位数算法的实现,但它似乎没有输出正确的结果,而且它对我来说似乎也不是线性复杂度,知道我在哪里偏离轨道了吗? def select(L): if len(L
我正在使用中位数中位数枢轴方法实现第 k 个选择算法。具体来说,我正在关注 pseudocode listed here. .但是,我的代码崩溃了(下面讨论的错误),我知道它崩溃的原因,但我不明白我能
我想将中位数算法应用于 35 个元素的列表 3 7 4 6 9 12 11 4 5 6 8 2 7 11 23 12 4 7 3 9 8 4 5 6 3 2 1 9 9 3 4 5 6 1 14 T(
作为家庭作业,我被分配编写算法,从无序数字集中找到第 k 个有序数字。作为一种方法,提出了算法中位数的中位数。 不幸的是,我的尝试失败了。如果有人发现错误 - 请纠正我。 private int fi
我已经明白了 我知道中位数算法的中位数(我将表示为 MoM)是一个高常数因子 O(N) 算法。它找到 k 组(通常为 5)的中位数,并将它们用作下一次迭代的集合以查找的中位数。找到它后的基准将在原始集
我的 Java 代码有问题...我已经盯着它看了 10 多个小时,但我就是找不到我犯的错误。 我的任务是实现“中位数的中位数”算法,将数组拆分为最大长度为 5 的数组并查找它们的中位数。然后查找这些中
我想通过以下示例了解“中位数的中位数”算法: 我们有 45 个不同的数字,分为 9 组,每组有 5 个元素。 48 43 38 33 28 23 18 13 8 49 44 39 34 29 24 1
CLRS 第 3 版第 9.3 节“最坏情况线性时间的选择”讨论了“选择”算法(由于 Blum、Floyd、Pratt、Rivest 和 Tarjan,有时称为 BFPRT 算法)用于查找 a 的中值
我正在搜索 John Tukey 算法,该算法使用 R 在我的线性回归上计算“阻力线”或“中值-中值线”。 邮件列表上的一位学生用这些术语解释了这个算法: "The way it's calculat
我的问题正如我在标题中指定的那样:test_median.cpp: In function ‘int main()’: test_median.cpp:26:27: error: cannot con
我正在实施quicksort,我希望将枢轴设置为中位数或三位数。这三个数字是第一个元素,中间元素和最后一个元素。 我能不能找到中位数呢?比较? median(int a[], int p, int r
自从最新的 R 更新以来,我得到了 Note summary.xmlImport: no visible global function definition for ‘median’ 在 CRAN
我使用 Medians of Medians 实现了第 nth_number 选择算法。在 wikipedia ,它指出它的空间复杂度是 O(1) 我必须将中位数存储在一个临时数组中,以便在这些中位数
中位数的中位数 方法在quicksort 类型的分区算法中非常流行,可以产生相当好的主元,从而均匀地分区数组。其逻辑在维基百科中给出为: The chosen pivot is both less t
我正在尝试将使用第一个元素作为基准的快速排序程序修改为使用三个中位数(第一个、最后一个和中间元素的中位数)作为基准的快速排序。然而,到目前为止,我的实现在测试时给出了 ArrayIndexOutOfB
我有一个关于 numpy.median() 在使用 numpy.ma.masked_array() 创建的屏蔽数组上的行为的问题。 正如我从调试自己的代码中了解到的那样,numpy.median()
给定两个具有唯一整数元素的数组,即元素在两个数组内或两个数组之间重复: 这是我编写的递归算法,需要帮助来破译我收到的错误消息。 public class Median { public static
在屏蔽数组的情况下,我对 numpy.median 的输出有点困惑。这是一个简单的示例(假设导入了 numpy - 我的版本是 1.6.2): >>> a = [3.0, 4.0, 5.0, 6.0,
有关问题的详情如下:。我期待中位数来一些价值,但它是未来0每一次,我总是得到一个不正确的模式。
有关问题的详情如下:。我期待中位数来一些价值,但它是未来0每一次,我总是得到一个不正确的模式。
我是一名优秀的程序员,十分优秀!