多路归并
多路归并:将已经排序好的多个数组合并起来
比如现在有四路:
a0: [1, 3, 6, 7]
a1: []
a2: [3, 5, 7, 19]
a3: [9, 12, 87, 98]
第一步需要知道每一路的最小值,如果每一路用数组表示的话需要保存对应的下标, 并保存为min_map
第0路: 1
第1路: 没有值
第2路: 3
第3路: 9
初始的min_map: {0: (1, 0), 2: (3, 0), 3: (9, 0)}
第二部需要将最小值取出来然。后检查被取出值的那一路是否还剩下其他元素, 如果存在, 则修改min_map里面对应的值, 如果不存在,则删除掉min_map里面对应的记录, 以表示该路已经没有元素需要遍历了
好了话不多说直接上代码吧。
#!/usr/bin/env python # -*- coding: utf-8 -*- # 多路归并:将已经排序好的多个数组合并起来 def nw_merge(arrs): ''' 需要知道每一路的最小值 第0路: 1 第1路: 没有值 第2路: 3 第3路: 9 ''' result = [] min_map = {} # 用min_map 保存每一路的当前最小值 for inx, arr in enumerate(arrs): if arr: min_map[inx] = (arr[0], 0) print "初始化的每一路最小值min_map", min_map while min_map: ''' 需要知道每一路的最小值里面哪一路的最小值, 以及最小值所在的那一路的index ''' min_ = min(min_map.items(), key = lambda m: m[1][0]) way_num, (way_min_v, way_inx) = min_ result.append(way_min_v) ''' 检查被取出值的那一路是否还剩下其他元素, 如果存在, 则修改min_map里面对应的值, 如果不存在, 则删除掉min_map里面对应的记录, 以表示该路已经没有元素需要遍历了 ''' way_inx += 1 if way_inx < len(arrs[way_num]): min_map[way_num] = (arrs[way_num][way_inx], way_inx) else: del min_map[way_num] return result a0 = [1, 3, 6, 7] a1 = [] a2 = [3, 5, 7, 19] a3 = [9, 12, 87, 98] arrs = [a0, a1, a2, a3] print "a0:", a0 print "a1:", a1 print "a2:", a2 print "a3:", a3 result = nw_merge(arrs) print "最终合并的:", result
最终输出为:
a0: [1, 3, 6, 7]
a1: []
a2: [3, 5, 7, 19]
a3: [9, 12, 87, 98]
初始化的每一路最小值min_map {0: (1, 0), 2: (3, 0), 3: (9, 0)}
最终合并的: [1, 3, 3, 5, 6, 7, 7, 9, 12, 19, 87, 98]