returns 来自两个集合的第 j 个最小元素的算法
Algorithm that returns j'th smallest element from two sets
我有一个作业要求从两个大小相等的集合 M 和 N 中 j 持有不同的数字,只能访问函数 kthsmallestM(int k) 和 kthsmallestN(int k),其中 return 分别是 M 和 N 中第 k 个最小的整数,算法应该从 M+N 中找到第 j 个最小的元素。
使用蛮力执行此操作的方法相当明显,但算法应该 运行 对 kthsmallestM 或 kthsmallestN 的 O(log j) 调用。我不是在寻找一个完整的解决方案,但我已经坚持了一段时间,所以如果能提供一些帮助我入门的建议,我们将不胜感激!
我尝试过的:
检查 M 的最大元素是否小于 N 的最小元素,反之亦然,在这种情况下,答案将只是 M 或 N 的最大元素,具体视情况而定。我尝试使用它来制作一个递归算法,该算法对两个集合的较小元素执行相同的检查,但很快就变成了 O(n)。
有什么建议吗?
k 个最小的元素将包含 x 个来自 M 的最小元素, k-x 中最小的 N.
如果我们对x进行猜测,那么我们可以使用kthsmallestM(x), kthsmallestN(k-x )、kthsmallestM(x+1)和kthsmallextN(k+1-x),看看我们的猜测是否过大低、过高或刚刚好。
这意味着我们可以进行二分查找来找到 x 从 0 到 j.
的正确值
我有一个作业要求从两个大小相等的集合 M 和 N 中 j 持有不同的数字,只能访问函数 kthsmallestM(int k) 和 kthsmallestN(int k),其中 return 分别是 M 和 N 中第 k 个最小的整数,算法应该从 M+N 中找到第 j 个最小的元素。
使用蛮力执行此操作的方法相当明显,但算法应该 运行 对 kthsmallestM 或 kthsmallestN 的 O(log j) 调用。我不是在寻找一个完整的解决方案,但我已经坚持了一段时间,所以如果能提供一些帮助我入门的建议,我们将不胜感激!
我尝试过的: 检查 M 的最大元素是否小于 N 的最小元素,反之亦然,在这种情况下,答案将只是 M 或 N 的最大元素,具体视情况而定。我尝试使用它来制作一个递归算法,该算法对两个集合的较小元素执行相同的检查,但很快就变成了 O(n)。
有什么建议吗?
k 个最小的元素将包含 x 个来自 M 的最小元素, k-x 中最小的 N.
如果我们对x进行猜测,那么我们可以使用kthsmallestM(x), kthsmallestN(k-x )、kthsmallestM(x+1)和kthsmallextN(k+1-x),看看我们的猜测是否过大低、过高或刚刚好。
这意味着我们可以进行二分查找来找到 x 从 0 到 j.
的正确值