【发布时间】:2011-09-05 03:58:17
【问题描述】:
我正在尝试找到 5 个排序数组的中位数的解决方案。这是一个面试题。
我能想到的解决方案是合并 5 个数组,然后找到中位数 [O(l+m+n+o+p)]。
我知道对于 2 个相同大小的排序数组,我们可以在 log(2n) 中完成。 [通过比较两个数组的中值,然后丢弃每个数组的一半并重复该过程]。 ..查找中位数可以是排序数组中的常数时间..所以我认为这不是 log(n) 吗? .. 这个时间复杂度是多少?
1] 5 个数组是否有类似的解决方案。如果数组大小相同怎么办,那么有更好的解决方案吗?
2] 我假设既然这被要求为 5,那么对于 N 个排序数组会有一些解决方案吗?
感谢您的任何指点。
我向面试官问了一些澄清/问题:
数组的长度是否相同
=> 没有
我想数组的值会有重叠
=> 是的
作为练习,我认为 2 个数组的逻辑没有扩展。这是一个尝试:
将上述 2 个数组的逻辑应用于 3 个数组:
[3,7,9] [4,8,15] [2,3,9] ... 中位数 7,8,3
抛出元素 [3,7,9] [4,8] [3,9] .. 中位数 7,6,6
抛出元素 [3,7] [8] [9] ..medians 5,8,9 ...
抛出元素 [7] [8] [9] .. 中位数 = 8 ... 这似乎不正确?
已排序元素的合并 => [2,3,4,7,8,9,15] => 预期中位数 = 7
【问题讨论】:
-
它们是单独排序的,还是每个数组也代表一个范围,在这个范围内另一个数组没有值?即,如果一个人的值在 1-5 范围内,那么另一个人的值可以在同一范围内吗?如果不是,那么您只需要确定数组的顺序(从最低到最高范围),将它们的所有长度相加,中间元素除以 2,然后转到包含该元素的数组。
-
感谢 filip-fku。我解决了你的问题。
-
这是一个臭名昭著的问题,因为这个想法相对容易,但要正确实施却极其困难。对于 k > 2,实现变得更糟。对我来说,这不适合技术面试。