arrays - 在未排序的数组中查找中位数(仅限于使用在线性中查找季度元素的子例程)

标签 arrays algorithm median

就像未排序数组的任何其他中值选择问题一样,但有额外的限制。我们需要使用提供的子例程/辅助函数 Quart(A,p,r),它在线性时间内找到给定子数组中的第 1/4 个有序项。我们如何使用这个辅助函数来查找数组的中位数?

进一步限制: 1. 您的解决方案必须就地执行(没有新的 可以创建数组)。特别是,一种替代解决方案是 将数组扩展到大小 m 以便 A[n+1, ... ,m] = 中的所有条目 1 且 m > 2n。在此之后,您将能够解决中位数 原始数组中的问题,只需调用一次四分位数问题 在扩展数组中。有了进一步的限制,这是不可能的。 2. 在运行算法时,您可以临时更改数组中的元素,例如,SWAP 更改元素。但是,在你的算法结束后,数组中的所有元素必须与开始时相同(但就像类里面教授的随机选择算法一样,它们的顺序可能与最初的顺序不同)。

由于不允许创建新数组,这意味着您只能修改少量(恒定)的项目。

最佳答案

  • 遍历数组并找到最小值和最大值。
  • 调用 Quart 求出四分位数值
  • 遍历数组并将 (max - min) + 1 添加到四分位数以下的所有值。这会将值的底部四分之一移动到顶部
  • 再次调用 Quart 以找到新值的四分位数(这将是原始值的中位数)
  • 遍历数组并从所有大于最大值的值中减去 (max - min) + 1 以将数组返回到其原始状态

您可能需要一些额外的规则来处理特殊情况,例如如果有多个值等于四分位数。

关于arrays - 在未排序的数组中查找中位数(仅限于使用在线性中查找季度元素的子例程),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55146374/

相关文章:

arrays - 使用 jq 删除与键匹配的对象和数组

algorithm - QuickSort分区的循环不变量

algorithm - 找到 x^2+y^2=z^2 解决方案的最佳复杂度

algorithm - 从列表中删除元素时更新中位数

javascript - if 语句中使用通配符检查数组元素 ID

组合字节数组以接受可变数量的参数

java - 交换数组元素值

JavaScript - 图遍历 - 从起始节点按顺序(最接近的第一个)获取节点

mysql - 获取 6 个表的中位数

algorithm - 优化 9 元素排序网络,减少到一个优化的中位数 9 网络?