Jackiesteed

www.github.com/jackiesteed

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

给定k个已经排序的数组,每个数组的长度是n。设计一个算法,把这k个已排序的数组归并成一个排序的数组。

思路是取出k个数组的第一个元素, 建一个最小堆.

然后不断地从堆顶取走元素x, 追加到结果数组中.

在x原来所在数组的下一个元素加到堆里面.

重复过程, 直到k个数组都为空.

=========================================================================================================

外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。

外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序。

在看输入法内核代码的时候发现一个对多路归并的应用.

==========================================================================================================

在网上搜多路归并的题目的话, 会看到poj2442

题意是给你一个m*n的矩阵,每一行取一个数求和一共有n^m种可能,然你求出前n小的n个和.

实际解法跟上面说的多路归并算法半毛钱关系没有.

因为如果你真的用多路归并的话, 大概解法就是不断地维护一个最小元素的数组, 这样就可以确定最小和了

但是在确定哪一个要加入堆里面的时候, 你会发现需要对两个列进行完全的比较, 而这样的时间开销是很大的.

实际解法就是分拆出子问题, 递归地先确定n-1路的前n小的和, 然后, 这n路的前n小的和就是n-1路的结果和第n路数据构成.

posted on 2012-12-01 22:10  Jackiesteed  阅读(866)  评论(0编辑  收藏  举报