使用来自 2 个排序数组的想法在 m 个排序数组中找到第 n 个最小值

Posted

技术标签:

【中文标题】使用来自 2 个排序数组的想法在 m 个排序数组中找到第 n 个最小值【英文标题】:find nth-smallest value across m sorted arrays using idea from 2 sorted arrays 【发布时间】:2014-04-29 15:54:57 【问题描述】:

请问有没有可能?一般的方法就像在两个排序数组上找到第 n 个值,忽略无关紧要的值并尝试通过调整递归中 n 的值来关注其余部分

2个排序数组的问题会产生计算时间O(log(|A|)+log(|B|),虽然问题是相似的,但我想问一下是否存在m个排序数组的时间算法O(log(|A1|)+log(|A2|)+...+log(|Am|)),

或者我上面提到的时间附近的一些类似变化(由于变量 m,我们可能需要一些其他排序算法来处理这些数组中的枢轴),

或者如果这样的算法不存在,为什么?

我只是在谷歌上找不到这个算法

【问题讨论】:

你需要澄清这个问题。您是指所有 m 个数组中的第 n 个最小的吗?还是别的什么? @smci:他/她还有什么意思?我没有看到其他合理的解释 上面说的就是这样,谢谢:p @Niklas-B:还有很多其他的可能性,因为他/她接着说'在两个排序数组上找到第 n 个值'。所以甚至不清楚他们是在谈论 2 还是 m 数组,还是 m 数组中的 2 的中间合并排序,或者什么。为什么不帮助编辑问题以清楚起见? 我知道我看到了类似的问题 - 所以我搜索了标题:***.com/questions/8753345/… 【参考方案1】:

有一个简单的随机算法:

    从任意 m 数组中随机选择一个枢轴。我们就叫它x 对于每个数组,对 x 进行二分搜索,以找出数组中有多少个 值。假设我们在数组 i 中有 ri 个值 。我们知道 x 在所有数组的并集中具有排名 r = sum(i = 1 to m, ri) 如果 n ,我们将每个数组 i 限制为索引 0...(ri - 1 ) 并递归。如果 n > r,我们将每个数组限制为索引 ri...|Ai | - 1 重复

期望的递归深度是O(log(N)),其中N是元素的总数,证明类似于Quickselect,所以期望运行时间类似于 O(m * log2(N))

论文"Generalized Selection and Ranking" by Frederickson and Johnson提出了针对不同场景的选择和排序算法,例如O(m + c * log(k/c))算法从m 大小相等的排序序列,c = minm, k

【讨论】:

相当令人印象深刻,但我实际上期待一些算法与本主题中所示的一样高效:Find n-th smallest value in two sorted arrays 即只需将案例扩展到 m 个数组,简单地集思广益,它应该可以在 O(log (|A1|)+log(|A2|)+...+log(|Am|)) 但是对于变量 m 应该如何实现?我会将此添加到我的主题中,再次感谢您的工作> @orb 你看过***.com/questions/6182488/median-of-5-sorted-arrays 吗?

以上是关于使用来自 2 个排序数组的想法在 m 个排序数组中找到第 n 个最小值的主要内容,如果未能解决你的问题,请参考以下文章

js交换数组中2个元素的位置,实现排序功能

如何在两个排序数组的并集中找到第 k 个最小的元素?

归并排序

排序算法----桶排序(数组)

基数排序

来自两个排序数组的最大对数