【发布时间】:2019-05-07 09:27:27
【问题描述】:
已经有一个answer 用于两个排序数组。但是,在我的问题中,其中一个数组未排序。
假设X[1..n] 和Y[1..m] 其中n < m。 X 已排序,Y 未排序。找到X U Y的第k个最小数的有效算法是什么。
MinHeap 可用于在未排序的数组中找到第 k 个最小的数。但是,这里对这些数组之一进行了排序。我能想到:
1. Building a `MinHeap` for `Y`
2. i = 1, j = 1
3. x1 = extract Min from Y
4. x2 = X[i];
5. if j == k: return min(x1, x2)
5. if x1 < x2: j++; goto 3
6. else: j++; i++; goto 4
它是否有效且正确?
【问题讨论】:
-
在为“Y”构建最小堆时,您已经涵盖了 O(m log m) 复杂度。那么,为什么不对“Y”进行排序并应用与两个排序数组相同的方法!!
-
我认为从 Y 构建堆就像对 Y 排序一样。构建堆的顺序是什么?从 Y 中提取 Min 的顺序是什么?
-
@MahmoudHanafy 用
m构建一个堆是O(m)。从中提取最小的东西是O(log(m))。按排序顺序提取所有内容是O(m log(m))。你可以在这个问题上做得更好。 -
@BishalGautam 从
Y构建堆是 O(m),而不是 O(m log m)。参见例如stackoverflow.com/questions/1787252/…