算法导论 6.5-8解答

原创 2012年03月24日 21:22:20

请给出一个时间为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个链表的第一个元素构建堆并输出最小元素。

循环体: 假设前一次循环正确。那么堆中剩下的元素都小于它们所在链表中的元素;

本次循环无法确定前次循环最小值所在的链表的表头元素与堆中元素的大小。

这次循环最小值存在于堆中已有的元素和前次循环最小值所在的链表的表头元素。

取出前次循环最小值所在的链表的表头元素添加到堆中,循环结束,保证了输出为剩下元素的最小值

结束: 循环结束,堆为空,输出为有序序列。



相关文章推荐

算法导论6.5-8习题解答(最小堆K路合并)

《算法导论》第六章第五节的第8题,原题为:请给出一个时间为O(nlgk)、用来将k个已排序链表合并为一个排序链表的算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并)。 算...

算法导论6.5-8

题目:k个已排序链表,元素总数是n,要求在nlgk时间复杂度内把k个链表合并为一个有序链表。 思路:取k个链表中每一个链表的第一个元素,共k个,将这k个元素建立一个最大堆(或最小堆),取出堆中的第一...

算法导论学习笔记 6.5 优先队列

优先队列(priority queue)是一种用来维护由一组元素构成的集合S的数据结构,其中的每一个元素都有一个相关的值,称为关键字(key)。一个最大优先队列支持一下操作:   INSERT(S,...

基于算法导论6.5用最大堆实现的优先队列(C++)

// algorithms.cpp : Defines the entry point for the console application. // #include "stdafx.h" #in...

“用最小堆将k个已排序链表合并为一个排序链表”(算法导论 练习6.5-9)

问题:请给出一个时间为O(nlgk),用来将k个已排序链表合并为一个排序链表的算法。此处的n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并) 编程思路: 假设k个链表都是非降...

算法导论6.5-8堆排序-K路合并

一、题目 请给出一个时间为O(nlgk)、用来将k个已排序链表合成一个排序链表算法。此处n为所有输入链表中元素的总数。(提示:用一个最小堆来做k路合并) 二、步骤 step1:取每个链表...

算法导论12.2-8 二叉搜索树的非递归遍历先驱节点分析

算法导论
  • mistakk
  • mistakk
  • 2015年12月28日 16:17
  • 384

算法导论10.2-8-用一个整数地址替代前后指针实现双向链表

#include #include #include using namespace std; typedef struct dlist{//双向链表 int value;//存储值 uns...

MIT算法导论-第7,8讲-哈希表

1.哈希函数的选择一个好的哈希函数H需要哪些特点:1.keys均匀的映射到表的槽内2.键值的分布特性应该不影响这种均匀性质选择的策略主要有两种:除法散列法 ,乘法散列法。(1)除法散列法: 定义has...

算法导论 8-2思考题 之线性时间原址排序

题目我就不把题目所有的内容全部写下来了,主要问题如下: n条记录,所有值都在1到k区间内,如何修改计数排序,使得它在O(n + k)的时间内完成对n条记录的原址排序。除输入数组外,你可以使用O(k...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论 6.5-8解答
举报原因:
原因补充:

(最多只允许输入30个字)