📅  最后修改于: 2023-12-03 14:50:39.852000             🧑  作者: Mango
合并 k 个排序数组是一个经典的算法问题,它要求将 k 个已经排序的数组合并成一个排序数组。这个问题在实际开发中经常遇到,特别是在处理大规模数据时。
给定 k 个排序数组,每个数组的大小可以不同。请你设计一个高效的算法,将这 k 个数组合并成一个排序数组。
输入:
[1, 4, 7],
[2, 5, 8, 11],
[3, 6, 9, 12, 15]
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15]
合并 k 个排序数组的常见解法有多种,以下介绍两种常用的解法。
一种简单的解法是先将前两个数组合并,再将合并后的结果与第三个数组合并,依此类推直到合并完所有的数组。该解法的基本思路是不断地合并两个已排序的数组,直到合并完所有的数组,得到最终的排序数组。
def mergeKArrays(arrays):
merged_array = arrays[0]
for i in range(1, len(arrays)):
merged_array = mergeTwoArrays(merged_array, arrays[i])
return merged_array
def mergeTwoArrays(array1, array2):
i = 0
j = 0
merged_array = []
while i < len(array1) and j < len(array2):
if array1[i] < array2[j]:
merged_array.append(array1[i])
i += 1
else:
merged_array.append(array2[j])
j += 1
merged_array.extend(array1[i:])
merged_array.extend(array2[j:])
return merged_array
该解法的时间复杂度为 O(n * log(k)),其中 n 是所有数组元素的总个数,k 是数组的个数。
另一种更高效的解法是使用优先队列(堆),通过维护一个大小为 k 的最小堆,每次从最小堆中取出最小值,然后将其对应的数组中下一个元素插入到堆中。重复这个过程直到堆为空,即所有数组中的元素都被处理过。
import heapq
def mergeKArrays(arrays):
merged_array = []
min_heap = []
# 初始化堆,将每个数组的第一个元素加入到最小堆中
for i in range(len(arrays)):
heapq.heappush(min_heap, (arrays[i][0], i, 0))
while min_heap:
val, array_index, index = heapq.heappop(min_heap) # 取出最小值
merged_array.append(val)
if index + 1 < len(arrays[array_index]):
# 将当前数组的下一个元素加入到最小堆中
heapq.heappush(min_heap, (arrays[array_index][index + 1], array_index, index + 1))
return merged_array
该解法利用了最小堆的特性,每次从堆中取出最小值的时间复杂度为 O(log(k)),而每个数组中的元素都会被处理一次,所以总的时间复杂度为 O(n * log(k)),其中 n 是所有数组元素的总个数,k 是数组的个数。
合并 k 个排序数组是一个常见的算法问题,有多种解法可以实现。通过逐个合并和使用堆的方式都可以高效地完成合并操作。具体选择哪种解法取决于输入数据的规模和实际场景的需求。
以上是两种常见的解法,供参考。在实际应用中,还可以根据具体问题的特点进行优化和调整,以求达到更好的性能和效果。