【问题标题】:Finding median in an unsorted array (restricted to use a subroutine that find the quarterly element in linear)在未排序的数组中查找中位数(仅限使用以线性方式查找季度元素的子程序)
【发布时间】:2019-03-13 16:06:58
【问题描述】:

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

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

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

【问题讨论】:

  • 欢迎来到 StackOverflow。目前您的问题无法真正得到回答,因为您没有提供代码或Quart 的详细描述。此外,如果您可以分享您之前的努力(即您的代码),那将是一件好事,这样人们就可以真正知道您到目前为止所做的尝试。请浏览Tour 并阅读On-topic guide,尤其是关于家庭作业以及如何提问的部分,因为这似乎是一个家庭作业问题(“课堂教学”)。问候。
  • "一组数据的中位数是该组中最中间的数。中位数也是该组中间的数。要找到中位数,首先要按顺序排列数据从最小到最大。”因此,根据数组长度是偶数还是奇数,您将选择中间的数字或中间的两个数字,然后将它们的总和除以 2。一口气,您可以将一个(或两个)数字交换为其余的,所以最小的数字在中间的左边,最大的数字在右边。然后,你就可以算算了。

标签: arrays algorithm median


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

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

【讨论】:

  • 我读到这个问题是因为Quart 是了解数组值的唯一方法。如果你能找到minmax,那么问题就很简单了(除非你知道如何使用Quart 来找到它们)。
  • @user58697 我猜你可以使用 Quart 读取单个元素,子数组大小为单个元素,如果这确实是限制的话。
猜你喜欢
  • 2012-08-31
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多