算法导论 6.5-8解答
2012-03-24 21:22
225 查看
请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的总数。
假设链表都是由小到大排列。
1. 将k个链表的第一个元素取出, 初始化为最小堆S;
2. 用 EXTRACT-MIN(S)返回最小元素,并返回链表序号minList;
3. 从序号minList的链表中取出表头元素,用INSERT(S,x)加入到堆中;//
此步至关重要,切记
4. 循环2-3直到n个元素全部输出。
k个元素,构建堆需要O(k)。插入元素需要O(lgk),总共n个元素,插入的时间为O(nlgk)。总时间为O(k )+O( nlgk),O(k)为常数,因此时间为O(k
)+O( nlgk)=O(nlgk)
初始化:
链表都是有序排列,因此最小元素存在k个链表的第一个元素。拿出k个链表的第一个元素构建堆并输出最小元素。
循环体:
假设前一次循环正确。那么堆中剩下的元素都小于它们所在链表中的元素;
本次循环无法确定前次循环最小值所在的链表的表头元素与堆中元素的大小。
这次循环最小值存在于堆中已有的元素和前次循环最小值所在的链表的表头元素。
取出前次循环最小值所在的链表的表头元素添加到堆中,循环结束,保证了输出为剩下元素的最小值
结束:
循环结束,堆为空,输出为有序序列。
假设链表都是由小到大排列。
1. 将k个链表的第一个元素取出, 初始化为最小堆S;
2. 用 EXTRACT-MIN(S)返回最小元素,并返回链表序号minList;
3. 从序号minList的链表中取出表头元素,用INSERT(S,x)加入到堆中;//
此步至关重要,切记
4. 循环2-3直到n个元素全部输出。
k个元素,构建堆需要O(k)。插入元素需要O(lgk),总共n个元素,插入的时间为O(nlgk)。总时间为O(k )+O( nlgk),O(k)为常数,因此时间为O(k
)+O( nlgk)=O(nlgk)
初始化:
链表都是有序排列,因此最小元素存在k个链表的第一个元素。拿出k个链表的第一个元素构建堆并输出最小元素。
循环体:
假设前一次循环正确。那么堆中剩下的元素都小于它们所在链表中的元素;
本次循环无法确定前次循环最小值所在的链表的表头元素与堆中元素的大小。
这次循环最小值存在于堆中已有的元素和前次循环最小值所在的链表的表头元素。
取出前次循环最小值所在的链表的表头元素添加到堆中,循环结束,保证了输出为剩下元素的最小值
结束:
循环结束,堆为空,输出为有序序列。
相关文章推荐
- 算法导论6.5-7习题解答
- 算法导论6.5-8习题解答(最小堆K路合并)
- 算法导论6.5-8习题解答(最小堆K路合并)
- 算法导论Java实现-利用堆合并数组(习题6.5-8) 求高手指导
- 算法导论6.5-8堆排序-K路合并
- 算法导论 CLRS 22.2-8 解答
- 算法导论 CLRS 25.2-3 解答
- 《算法导论》习题解答 Chapter 22.1-5(求平方图)
- 算法导论 习题6.5-8
- 算法导论2.3-7习题解答(合并排序算法及二分查找)
- 算法导论8-3(a)习题解答(基数排序)
- 《算法导论》 - 第6章 - 堆排序 - 习题解答
- 算法导论9.3-9习题解答(寻找中位数)
- 算法导论Java实现-优先级队列(6.5章节)
- CentOS6.5连接Wifi详细步骤及常见问题解答
- 算法导论6.5-8堆排序-K路合并
- 算法导论 CLRS 17.3-5 解答
- 算法导论 CLRS 22.4-2 解答
- [转]Centos6.5+CUDA6.5+caffe安装配置及可能遇到问题解答
- 《算法导论》习题解答 Chapter 22.1-5(求平方图)