[Introduction to algorithm]solution to Exercises 6.5-8

Exercises 6.5-8

Start example

Give an O(n lg k)-time algorithm to merge k sorted lists into one sorted list, where n is the total number of elements in all the input lists. (Hint: Use a min-heap for k-way merging.)


 
time cost: O(k) + O(k) + O(n*lgk) = O(n*lgk)
loop invariant:
(1) At the start of each iteration of the 'for' loop of lines 5-12, B[1..i-1] contains the i-1 smallest elements of lists A[1..k], in sorted order.
(2) There is only one smallest element  of each list of A[1..k] in the min-heap T if the list is not empty. 

 

Initialization:  B[1..i-1] is empty, the trivial case,显然成立
Maintenance:  根据假设(2)由于小根堆T中的元素是由剩余非空list每个抽取最小元素组成,因此还没有拷贝到B的元素中的最小元素就在T中,即为T[1], 现把T[1]拷贝到B[i],又由于假设(1)因此下次循环时(i增加1后),B[1..i-1]含有所有输入链A[1..k]的前i-1个最小的元素,且是按递增序的,(1)成立。
在从T[1所在list删除最小元素(即T[1],第8行删除)后,如果该list为空(第9行)那么把T[1]从T中小根堆中删除(同时维护了小根堆的特性),(2)成立。如果该list不为空(第11行),那么把该list的最小元素加入到小根堆中,(2)仍然成立。
Termination: 循环结束时,i为n+1,B[1..n]中含有所有输入list的前n个最小元素,且已经排好序,即所有元素都按序放入到了B中。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值