多路归并

多路归并:将已经排序好的多个数组合并起来

比如现在有四路:

  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]

 

posted @ 2017-12-16 10:45  天使的魅影  阅读(782)  评论(0编辑  收藏  举报