算法导论 6.5.9 堆实现K路归并问题

问题: 设计一个时间复杂度为O(NlogK)的算法,它能够将K个有序链表合并为一个有序链表,这里的N为所有输入链表包含的总的元素个数

分析:

该问题为经典的利用堆完成K路归并的问题:

当K个序列满足一定的条件(如单调不减或单调不增)时,利用堆实现K路归并使其归并为一个满足相同条件的

序列,具体做法如下:

1)假设存在K个序列,从每一个序列中取出一个元素放于堆中;

2)从堆中取出顶端元素,并在该元素的序列中取出下一个元素插入堆中。

3)重复操作1)与2),直到完成归并。

具体问题: poj_2051

时间: 2024-10-25 13:43:20

算法导论 6.5.9 堆实现K路归并问题的相关文章

【二叉堆】k路归并问题(BSOJ1941)

Description 有n个函数,分别为F1,F2,...,Fn.定义Fi(x)=Ai*x^2+Bi*x+Ci(x∈N*).给定这些Ai.Bi和Ci,请求出所有函数的所有函数值中最小的m个(如有重复的要输出多个). Input 第一行输入两个正整数n和m.以下n行每行三个正整数,其中第i行的三个数分别位Ai.Bi和Ci.Ai<=10,Bi<=100,Ci<=10 000. Output 输出将这n个函数所有可以生成的函数值排序后的前m个元素.这m个数应该输出到一行,用空格隔开. Sam

Merge k Sorted Lists, k路归并

import java.util.Arrays; import java.util.List; import java.util.PriorityQueue; /* class ListNode { ListNode next; int val; ListNode(int x) { val = x; } } */ //k路归并问题 public class MergKSortedLists { //二路归并,这个算法时间复杂度o(2n) public ListNode mergeTwoLists

算法导论 6-2 d叉堆

问题: d叉堆性质与二叉堆相似,但其每个非叶子结点有d个孩子: 1) 如何在一个数组中表示一个d叉堆? 2) 包含n个元素的d叉堆的高度是多少? 3) 给出 EXTRACT-MAX在d叉堆的有效实现,并用d与n表示其时间复杂度. 4) 给出INSERT在d叉堆的有效实现,并用d与n表示其时间复杂度. 5) 给出INCREASE-KEY(A, i, k)的有效实现.当k < A[i]时,它会触法一个错误,否则执行A[i] = k, 并更新相应的d叉最大堆,使用d与n表示其时间复杂度. 3)  HE

k路归并 算法导论8-4(e)

使用STL中priority_queue(由最大最小堆实现的)来实现.注意传递参数的时候需要传递三个. 模板声明:priority_queue<Type, Container, Functional> 这里的实现要求输入完全正确,所以代码移植性非常差. #include <iostream> #include <algorithm> #include <queue> using namespace std; typedef struct { int key;

算法导论第6章堆heap

heap // heap.h // PARENT(i) // return i / 2 // LEFT(i) // return 2 * i // RIGHT(i) // return 2 * i + 1 // MAX-HEAPIFY(A, i) // l = LEFT(i) // r = RIGHT(i) // if l <= A.heap-size and A[l] > a[i] // largest = l // else largest = i // if r <= A.heap

POJ 2442-Sequence(heap+k路归并)

Sequence Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 7447   Accepted: 2451 Description Given m sequences, each contains n non-negative integer. Now we may select one number from each sequence to form a sequence with m integers. It's

POJ-2442 Sequence (K路归并问题拓展)

题意:有n行含m个元素序列,从每行取一个数得到他们的和,一共可以得到m^n个和.输出前n个最小的和. 思路:可以用优先队列递归解决,当只取前两行的数,得到两个数的和的前n小的序列.这个序列就相当于把第一行和第二行合并,再解决n-1行的子问题. 用优先队列解决的时候也有点小技巧,类似尺取法. //236 KB 563 ms C++ 1480 B #include<cstdio> #include<iostream> #include<cstring> #include&l

算法导论-- 线性时间排序(计数排序、基数排序、桶排序)

线性时间排序 前面介绍的几种排序,都是能够在复杂度nlg(n)时间内排序n个数的算法,这些算法都是通过比较来决定它们的顺序,这类算法叫做比较排序 .下面介绍的几种算法用运算去排序,且它们的复杂度是线性时间. -------------------------------------- 1.计数排序 计数排序采用的方法是:对每个元素x,去确定小于x的元素的个数,从而就可以知道元素x在输出数组中的哪个位置了. 计数排序的一个重要性质是它是稳定的,即对于相同的两个数,排序后,还会保持它们在输入数组中的

算法导论第六章优先队列(二)

优先队列可以说是堆的一个非常重要的应用,和堆对应,优先队列也分最小优先队列和最大优先队列. 优先队列是一种用来维护由一组元素构成的集合S的数据结构,其中每一个元素都有一个关键字(key),关键字赋予了一个元素的优先级,故名为优先队列.之所以用堆来实现优先队列,我想最大的原因是堆很容易对元素按关键字进行排序. 优先队列的应用: 最大优先队列:其中最为典型的就是“共享计算机系统的作业调度”,通过记录各个作业的优先级,来调度一个作业的执行.删除和插入等操作. 最小优先队列:可以被用于“基于事件驱动的模