arrays - 在不排序的情况下找到未排序数组的中位数

标签 arrays algorithm median

<分区>

有没有办法找到未排序数组的中位数: 1- 没有排序。 2-不使用select算法,也不使用中位数的中位数

我发现了很多与我类似的其他问题。但是大多数解决方案(如果不是全部)都讨论了 SelectProblem 和 MedianOfMedians

最佳答案

你当然可以在不排序的情况下找到数组的中位数。有效地做到这一点并不容易。

例如,您可以只遍历数组的元素;对于每个元素,计算小于和等于它的元素数,直到找到具有正确计数的值。这将是 O(n2) 时间,但只有 O(1) 空间。

或者您可以使用大小刚好超过数组大小一半的最小堆。 (也就是说,如果数组有 2k2k+1 元素,那么堆应该有 k+1 元素。)构建堆使用第一个数组元素,使用标准堆构建算法(即 O(N))。然后,对于每个剩余元素 x,如果 x 大于堆的最小值,则将最小元素替换为 x 并执行 SiftUp 操作(这是 O(log N))。最后,中值要么是堆的最小元素(如果原始数组的大小是奇数),要么是堆中两个最小元素的平均值。因此,如果不能重新排列数组元素,则总共需要 O(n log n) 时间和 O(n) 空间。 (如果您可以重新排列数组元素,则可以就地执行此操作。)

关于arrays - 在不排序的情况下找到未排序数组的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33964676/

相关文章:

c - 阻止 Tic Tac Toe 覆盖 C 中的 Action

java - 语法错误以及为什么会出现这些错误?

c# - System.Array 是否对值类型执行装箱?

计算最小除数的两个替代函数的性能

c++ - 如果方法是const,如何找到 vector 的中值?

c - int* ptr 和 int(* arr)[3] =&a 之间的区别

algorithm - 将无向循环图投影到坐标平面上

arrays - 计算最多包含 k 个奇数的子数组

用该列的中位数替换矩阵每一列中的 NA

c - 中值滤波器实现测试