现在的位置: 首页 > 综合 > 正文

基于堆的K路合并问题

2012年02月20日 ⁄ 综合 ⁄ 共 463字 ⁄ 字号 评论关闭

题:请给出一下时间为O(n*lgk),用来将 k 个已排序链表合并为一个排序链表的算法.此处,n 次所有输入链表中元素的总数.

答: 新建一个链表,再申请一个大小为 k 的数组A,首先把 k 个已排序链表的第一个元素压入 A 中,将 A 建成一个最小堆,花费O(k) 的时间.然后将堆 A 的第一个元素 min(也就是最小的那个)放入链表中.再将min->nextNode 放在min的位置.再花O(lgk)调用heapify 方法将 A 重新建成一个最小堆.然后又将第一个元素 min 放入链表......重复进行就可将 k 个已排序链表合并.(当最后剩余不到 k 个节点时情况会有点变化,但很容易解决).显然,这样处理的时间复杂为 O(n*lgk);

伪代码:

create A[n];

i=0;

for m<- 1 to k

    do while(list[m->next != NULL)

         A[i]=*list[m]->next;

         list[m]->next=list[m]->next->next;

         i<-i+1;

build_min_heap(A);

抱歉!评论已关闭.