日期:2014-05-20  浏览次数:20651 次

求教一个多路归并算法
假如:我有一些文件,里面存储的是一些数据,像数据库那样,一个ID对应一个值,并且文件内的数据有序,因为每个文件都可能存储了同一ID值的信息,现在要将这所有文件的数据合并起来,对于相同ID的数据进行加操作,合并之后生成一个文件,这个文件内的数据应该也要按照ID排序。如果我要使用多路归并算法要怎么实现呢?
能不能告诉给我讲一讲多路归并算法的原理?

我也想过算法:
首先对每个文件只读一行,将数据存入PriorityQueue,   然后进行相同的操作,对每个文件再读一行,将数据存入另一个PriorityQueue,再就将两个PriorityQueue合并成一个PriorityQueue,然后反复这样读取数据和合并数据,每一次都能生成一个PriorityQueue,读完了所有文件之后将PriorityQueue输出到文件,就可以得到合并之后的数据文件。
这算不算多路归并?

我应该怎么样做呢?


------解决方案--------------------
自己接自己的贴!我希望可以充分把我理解展现出来,请各位纠正。

回想一个两路归并是将两个有序的队列进行归并,是不是说多路归并就可以同时对多个有序队列进行归并呢?
既然我的文件中的数据是有序的,那如果将这些文件看成是队列,那我已经有许多有序的队列了,我要做的是初始化一个队列,从第一个文件的第一个数据开始读,把数据加入到我创建的队列里,然后读第二个文件的第一个数据,将这个数据和我队列中的数据比一下,如果是ID的数据,就加起来,如果不同,就插入到队列里面..循环这个过程,一直到把每个文件都到一遍,每读一遍都会一定会产生一个最小的已经合并好的数据,然后把这个数据输出到文件里面,然后对所有文件的第二行进行同样的读写, 重复以上的过程一直到所有的文件都读完为止。

上述的方案选用合适的数据结构应该可行吧,这叫多路归并排序么?

如果有要求说,归并排序中一定要使用到PriorityQueue,那该怎么做呢?我总觉得不行。
上面所说的方法是每一次读到数据就将数据放入到队列中,如果队列中有相同的ID的元素就加起来,没有就插入,但是PriorityQueue的poll方法只能取出第一个元素,假如队列中有ID=100和ID=120两个元素,此时我又读到了ID=200的元素,我启不是要通过查找方法将ID=200的元素找出来然后加起来??