【问题标题】:Selection in two sorted arrays两个排序数组中的选择
【发布时间】:2014-12-13 16:39:38
【问题描述】:

给定两个大小分别为 N1 和 N2 的排序数组 a[] 和 b[],设计一个算法来找到第 k 个最大的键。你的算法最坏情况运行时间的增长顺序应该是 lg(N1+N2)。

这个问题的提示说有两种可能的解决方案:

方法 A:计算 a[]  中的中位数和 b[] 中的中位数。 在大约一半大小的子问题中重复出现。

我已经实现了这个解决方案(其本质包括将 a[] 和 b[] 调整大小/截断到长度 k,找到每个中的中值,比较它们,并选择数组的适当一半 - 处理极端情况视情况而定。)

给出的另一种方法是:

设计一个常数时间算法来判断 a[i]  是否是第 k 个 最大的关键。使用这个子程序和二分查找。

我很难找出如何采用这种方法。我知道只给一个数组,只需查看该元素的索引,就可以在 O(1) 时间内找到给定元素是否是第 k 大键。但是,我不确定当两个数组如何确定一个元素是否是这两个数组联合中的第 k 个元素。

【问题讨论】:

    标签: arrays algorithm sorting search


    【解决方案1】:

    如果xa ⋃ b 中的第k 个最大元素,那么a ⋃ b 中正好有k-1 更大的元素。假设数组按降序排序——如果它们以其他方式排序,则必须调整算术——那么a 中恰好有i-1 元素大于a[i];联合中任何剩余的较大元素必须来自b

    因此,如果b 中恰好有k-i 更大的元素,a[i]a ⋃ b 中的第 kth 个元素,因为在这种情况下,i-1 + k-i == k-1 将更大联盟中的元素。所以你需要比较 a[i]b[k-i]b[k-i+1] 来找出答案,这肯定是 O(1)。

    【讨论】:

    • 现在我被困在尝试在某种二进制搜索中使用它来查找a U b 中的第 k 个最大元素。我尝试了以下方法:我修改了算法以确定数组A中的元素是否大于或等于A U B中的第k大元素,然后在A中进行二进制搜索,如果没有找到,对数组B做同样的事情. 这有 O(logA + logB) 复杂度。有没有办法在 O(log(A+B)) 复杂度中做到这一点?
    • @user2612743:本质上,O(logA + logB) 与 O(log(A+B)) 相同,因为它们最多相差 2 倍。
    • 你是怎么知道的?对数定律不是 O(logA + logB) = O(log(A*B)) 吗?这如何渐近地等价于 O(log(A+B))?
    • @user2612743: 1 2*log(max(A,B)) = log(max(A,B)) + log(max(A,B)) >= log(A) + log(B)。
    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2016-08-15
    • 2023-03-15
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多