多路归并
#!/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
第1路: 没有值
第2路: 3
第3路: 9
初始的min_map: {0: (1, 0), 2: (3, 0), 3: (9, 0)}
第二部需要将最小值取出来然。后检查被取出值的那一路是否还剩下其他元素, 如果存在, 则修改min_map里面对应的值, 如果不存在,则删除掉min_map里面对应的记录, 以表示该路已经没有元素需要遍历了
最后更新于 2020-05-20 05:36:15 并被添加「」标签,已有 2842 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处