了解“中位数的中位数”算法

2024-03-29

我想了解以下示例的“中位数”算法:

我们有 45 个不同的数字,分为 9 组,每组 5 个元素。

48 43 38 33 28 23 18 13 8

49 44 39 34 29 24 19 14 9 

50 45 40 35 30 25 20 15 10

51 46 41 36 31 26 21 16 53

52 47 42 37 32 27 22 17 54
  1. 第一步是对每个组进行排序(在本例中它们已经排序)
  2. 递归地第二步,找到中位数的“真实”中位数(50 45 40 35 30 25 20 15 10)即该集合将被分为 2 组:

    50 25
    
    45 20 
    
    40 15
    
    35 10
    
    30
    

    对这 2 组进行排序

    30 10
    
    35 15 
    
    40 20
    
    45 25
    
    50
    

中位数是 40 和 15(如果数字是偶数,我们取左边的中位数) 所以返回的值为 15,但是中位数的“真实”中位数(50 45 40 35 30 25 20 15 10) 为 30,此外还有 5 个小于 15 的元素,远小于 45 中提到的 30%维基百科 http://en.wikipedia.org/wiki/Selection_algorithm#Linear%5Fgeneral%5Fselection%5Falgorithm%5F-%5F.22Median%5Fof%5FMedians%5Falgorithm.22

and so T(n) <= T(n/5) + T(7n/10) + O(n) fails.

顺便说一句,在维基百科的例子中,我得到的递归结果是 36。然而,真正的中位数是 47。

所以,我认为在某些情况下,这种递归可能不会返回中位数的真实中位数。我想了解我的错误在哪里。


这里是伪代码 http://www.ics.uci.edu/~eppstein/161/960130.html对于中位数算法的中位数(稍微修改以适合您的示例)。维基百科中的伪代码未能描述其内部工作原理selectIdx函数调用。

我已在代码中添加了注释以进行解释。

// L is the array on which median of medians needs to be found.
// k is the expected median position. E.g. first select call might look like:
// select (array, N/2), where 'array' is an array of numbers of length N

select(L,k)
{

    if (L has 5 or fewer elements) {
        sort L
        return the element in the kth position
    }

    partition L into subsets S[i] of five elements each
        (there will be n/5 subsets total).

    for (i = 1 to n/5) do
        x[i] = select(S[i],3)

    M = select({x[i]}, n/10)

    // The code to follow ensures that even if M turns out to be the
    // smallest/largest value in the array, we'll get the kth smallest
    // element in the array

    // Partition array into three groups based on their value as
    // compared to median M

    partition L into L1<M, L2=M, L3>M

    // Compare the expected median position k with length of first array L1
    // Run recursive select over the array L1 if k is less than length
    // of array L1
    if (k <= length(L1))
        return select(L1,k)

    // Check if k falls in L3 array. Recurse accordingly
    else if (k > length(L1)+length(L2))
        return select(L3,k-length(L1)-length(L2))

    // Simply return M since k falls in L2
    else return M

}

以你的例子为例:

中位数函数的中位数将在 45 个元素的整个数组上调用,例如(k = 45/2 = 22):

median = select({48 49 50 51 52 43 44 45 46 47 38 39 40 41 42 33 34 35 36 37 28 29 30 31 32 23 24 25 26 27 18 19 20 21 22 13 14 15 16 17 8 9 10 53 54}, 45/2)
  1. 第一次M = select({x[i]}, n/10)被称为,数组{x[i]}将包含以下数字:50 45 40 35 30 20 15 10。 在这次通话中,n = 45,因此 select 函数调用将是M = select({50 45 40 35 30 20 15 10}, 4)

  2. 第二次M = select({x[i]}, n/10)被称为,数组{x[i]}将包含以下数字:40 20。 在这次通话中,n = 9因此电话将是M = select({40 20}, 0)。 此选择调用将返回并分配值M = 20.

    现在,到了您有疑问的地步,我们现在对数组进行分区L around M = 20 with k = 4.

    记住数组L这是:50 45 40 35 30 20 15 10.

    该数组将被划分为L1, L2 and L3按照规则L1 < M, L2 = M and L3 > M。因此:
    L1: 10 15
    L2: 20
    L3: 30 35 40 45 50

    Since k = 4,它大于length(L1) + length(L2) = 3。因此,现在将通过以下递归调用继续搜索:
    return select(L3,k-length(L1)-length(L2))

    翻译过来就是:
    return select({30 35 40 45 50}, 1)

    结果将返回 30。 (由于 L 有 5 个或更少的元素,因此它将返回第 k 个元素,即排序数组中的第一个位置,即 30)。

Now, M = 30将在第一时间收到select对 45 个元素的整个数组进行函数调用,以及分隔数组的相同分区逻辑L around M = 30将应用于最终获得中位数的中位数。

唷!我希望我能够足够详细和清晰地解释中位数算法的中位数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解“中位数的中位数”算法 的相关文章

  • 如何求能被7整除的数字个数?

    给定一个整数N 如何有效地找到范围内能被 7 整除的数字的个数 其逆序也能被 7 整除 0 10 N 1 Example For N 2 回答 4 0 7 70 77 0到99之间所有能被7整除的数字 它们的倒数也能被7整除 我的方法 简单
  • 使用 Sethi-Ullman 算法的表达式的代码生成器

    Give a AST tree http en wikipedia org wiki Abstract syntax tree 我想生成一种类似汇编的语言 我正在尝试使用塞西 乌尔曼 http en wikipedia org wiki S
  • C++ STL 下一个排列与组合

    我知道我可以使用std next permutation在包含元素的某些容器上 1 2 3 这将生成该序列的 6 种排列 我想做的是给定一些设置 1 2 3 4 5 6 生成大小为 3 的所有可能的排列 因此对于这个例子 4 3 2 将是由
  • 递归关系

    为什么递归阶乘算法的递推关系是这样的 T n 1 for n 0 T n 1 T n 1 for n gt 0 为什么不是这个呢 T n 1 for n 0 T n n T n 1 for n gt 0 输入 n 的值 即 1 2 3 4
  • 产生独特的价值

    我想创建一个C程序生成 0 到 999999 之间的数字 请记住生成的数字不应包含任何重复的数字 例如 123 是一个可接受的值 但不是 121 as the 1 被重复 我已经找到了其他程序代码来检查整数是否有重复的数字 检查整数是否有重
  • 在等式约束的情况下求解线性规划

    我问了一个问题 可以在这里找到 计算最优组合 https stackoverflow com questions 17232596 computing the optimal combination 并有人建议线性规划 我查阅了线性规划和单
  • 为什么循环比循环体多执行一次?

    摘自算法教科书的一段话 当 for 或 while 循环以通常的方式退出时 即 由于循环头中的测试 测试的执行次数比循环体多执行一次 因此 例如 一个 for 循环以for j 1 to 3会被执行不是3次 而是4次 问题 为什么这样的循环
  • boost::property_map 在 boost 中是如何实现的以及如何更改它

    我想知道属性映射是如何在提升图中实现的 例如 我的顶点和边属性定义如下 vertex property gt struct NodeInfo int a b c actual bundled property struct NodeInfo
  • 硬币数量有限的最小硬币找零问题

    具体来说 问题是 给定面值数组coins 每个硬币的限制数组limits 和数量amount 返回minimum需要的硬币数量 以获得amount 或者如果不可能返回 null 另外填充数组change解决方案中使用的每个硬币的数量 这是我
  • 如何用 Java 为 2D 游戏构建 Tiled 地图?

    不知道如何解决这个问题 基本上 我想要 400x400 窗口的 Pixel gt Tile 表示 屏幕上的每个坐标 例如120x300应该是图块的一部分 我最小的精灵是 4 个像素 所以我们可以说 1 个图块 4 个像素 玩家和敌人精灵都是
  • 如何以编程方式证明“六度分离”概念?

    我有一个包含 2000 万用户以及这些人之间的联系的数据库 如何证明 六度分离 的概念以最有效的方式在编程中 链接到有关六度分离的文章 http en wikipedia org wiki Six degrees of separation
  • 有效地将相似的数字分组在一起[重复]

    这个问题在这里已经有答案了 可能的重复 一维数数组聚类 https stackoverflow com questions 11513484 1d number array clustering 我有一个数字数组 例如 1 20 300 4
  • JS中的递归排序

    在一次采访中 我被要求编写一个程序 算法来使用递归对数字数组进行排序 虽然我含糊地回答了它 但我尝试并想出了以下代码 您可以使用以下JSFiddle https jsfiddle net RajeshDixit 2u9mLegv 1 链接来
  • 如何有效地合并两个 BST?

    如何合并两个二叉搜索树并保持BST的性质 如果我们决定从树中取出每个元素并将其插入到另一个元素中 则此方法的复杂度将为O n1 log n2 where n1是树的节点数 比如T1 我们已经拆分了 并且n2是另一棵树的节点数 比如T2 执行
  • 如何读取未知数量的输入?

    我正在使用 C Primer 这本书学习 C In 第1 4 3节 给出了以下关于读取未知数量的输入的示例代码 include
  • 用于检索编辑距离接近的字符串的数据结构

    例如 从一组英语单词开始 是否有一种结构 算法允许使用单词 right 作为查询来快速检索诸如 light 和 tight 之类的字符串 即 我想检索与查询字符串编辑距离较小的字符串 The BK tree http blog notdot
  • 带回溯的 Dijkstra 算法?

    In a 相关主题 https stackoverflow com questions 28333756 finding most efficient path between two nodes in an interval graph
  • 天气预报算法多样

    目前 英国气象局的预测引发了一场巨大的 风暴 他们预测冬季将是温和 潮湿的冬季 而北爱尔兰的气温却是有记录以来最冷的 地面上有厚厚的积雪 这在 12 月通常很少见 这是我很想尝试的东西 并不是我声称我可以击败他们 而是想知道人们目前正在使用
  • 如何将多个矩形打包为 2d 盒子俄罗斯方块样式

    我有许多不同宽度和高度的矩形 我有一个更大的矩形平台来放置它们 我想将它们包装在平台的一侧 以便它们在纵向 X 尺寸上展开 但将横向 Y 尺寸保持在最小限度 就是把它们像俄罗斯方块游戏一样放置 不能有重叠 但可以有间隙 有没有算法可以做到这
  • Kamada 和 Kawai 图形布局算法? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有人尝试过 Kamada Kawai 的 88 算法来绘制一般无向图吗 如果是这样 并且您知道其中的任

随机推荐