两个排序数组并找到第 k 个最小的数字
two sorted array and find k'th smallest number
两个排序数组 A, B
,长度为 n,m
(n <= m)
,k
给出 (k >= log n)
。
和log (nm)
我们可以找到k-th
这两个数组并集的最小数。
我有问题 2 here 的解决方案,但我的挑战是为什么两个给定条件“(n <= m)”和“k >= log n”不影响此算法?
第一个假设:n <= m
是一个“不失一般性”的假设。如果 n >= m,那么只需在头脑中交换 A 和 B。他们包括了这个假设,即使它不是必需的,因为他们觉得做出这个假设是“自由的”。
第二个假设:找到第 k
个最小元素的简单算法是同时迭代 A 和 B,在具有两者中较小元素的数组中前进。这将与 运行ning 来自 mergesort 的“Merge”功能完全一样,但是一旦您合并了前 k 个元素就停止。复杂度为 O(k)。他们希望你找到一个更复杂的算法,所以他们通过声明 k >= log(n) 来“排除”这个算法,这意味着复杂度 O(k) 永远不会比 O(log(n)) 好。从技术上讲,如果他们想彻底排除这个算法,他们也应该声明 k <= n + m - log(n)
,否则你可以 运行 最后的“合并”功能:合并 n+m-k 个最大的元素,然后 return 第 n+m-k
个最大的元素,与第 k 个最小的元素相同。
两个排序数组 A, B
,长度为 n,m
(n <= m)
,k
给出 (k >= log n)
。
和log (nm)
我们可以找到k-th
这两个数组并集的最小数。
我有问题 2 here 的解决方案,但我的挑战是为什么两个给定条件“(n <= m)”和“k >= log n”不影响此算法?
第一个假设:
n <= m
是一个“不失一般性”的假设。如果 n >= m,那么只需在头脑中交换 A 和 B。他们包括了这个假设,即使它不是必需的,因为他们觉得做出这个假设是“自由的”。第二个假设:找到第
k
个最小元素的简单算法是同时迭代 A 和 B,在具有两者中较小元素的数组中前进。这将与 运行ning 来自 mergesort 的“Merge”功能完全一样,但是一旦您合并了前 k 个元素就停止。复杂度为 O(k)。他们希望你找到一个更复杂的算法,所以他们通过声明 k >= log(n) 来“排除”这个算法,这意味着复杂度 O(k) 永远不会比 O(log(n)) 好。从技术上讲,如果他们想彻底排除这个算法,他们也应该声明k <= n + m - log(n)
,否则你可以 运行 最后的“合并”功能:合并 n+m-k 个最大的元素,然后 return 第n+m-k
个最大的元素,与第 k 个最小的元素相同。