优先队列实现n路归并算法O(n * lgK)

简介:

//problem description: merge K sorted lists with total N elements
//solution: put the front element of each list into a priority queue,
// till finish, pop the min value from the priority queue, and enqueue
// the next element in corresponding list, delete that element
//time complexity:
// select min value in the queue with K elements: O(lgK)
// repeat O(n) times
// time complexity = O(n * lgK)
//space complexity:
// output array = O(n)
// priority queue = O(k)
// space complexity = O(n + k) = O(n)
#include <queue>
#include <list>
#include <vector>
#include <iostream>
using namespace std;

//support compare function for priority heap
struct Comparator
{
bool operator()(const list<int>*a, const list<int>*b) const 
{
if(b->size() == 0)
return false;
return a->front() > b->front();
}
};

vector<int> nWayMerge(list<list<int> >& l)
{
vector<int> output;
priority_queue<list<int>*, vector<list<int>* >, Comparator> q;
list<list<int> >::iterator iter;
//initialize the priority queue by
//putting each list
//into the queue 
for(iter = l.begin(); iter != l.end(); iter++)
q.push(&*iter);

//once the min list goes empty,
//we know all elements has been dealed
while(q.top()->size() != 0)
{
//pop the min element in the queue
output.push_back(q.top()->front());
q.top()->pop_front();
list<int>* l = q.top();
q.pop();
q.push(l);
}
return output;
}
int main()
{
//test cases with 3 sorted lists
list<list<int> > input;
list<int> l1 = {12, 15, 16, 18, 20};
list<int> l2 = {11, 13, 18, 20, 22};
list<int> l3 = {9, 14, 15, 20, 23};
input.push_back(l1);
input.push_back(l2);
input.push_back(l3);
vector<int> v = nWayMerge(input);
for(vector<int>::iterator iter = v.begin(); iter != v.end(); iter++)
cout << *iter << endl;
return 0;
}

本文转自博客园知识天地的博客,原文链接:优先队列实现n路归并算法O(n * lgK),如需转载请自行联系原博主。

相关文章
|
1天前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
47 32
|
7月前
|
算法 C++
数据结构与算法===优先队列
数据结构与算法===优先队列
数据结构与算法===优先队列
|
3月前
|
数据可视化 搜索推荐 Python
Leecode 刷题笔记之可视化六大排序算法:冒泡、快速、归并、插入、选择、桶排序
这篇文章是关于LeetCode刷题笔记,主要介绍了六大排序算法(冒泡、快速、归并、插入、选择、桶排序)的Python实现及其可视化过程。
26 0
|
5月前
|
搜索推荐 算法
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
十大排序算法-快排-希尔-堆排-归并-冒泡-桶排-选择-插入-计数-基数
|
6月前
|
搜索推荐 C++ Python
Python排序算法大PK:归并VS快速,谁才是你的效率之选?
【7月更文挑战第13天】归并排序** 使用分治法,稳定且平均时间复杂度O(n log n),适合保持元素顺序和并行处理。
41 5
|
6月前
|
算法 安全 调度
逆天改命!Python高级数据结构堆(Heap)与优先队列,让你的算法效率飙升至宇宙级!
【7月更文挑战第8天】Python的heapq模块和queue.PriorityQueue实现了堆和优先队列,提供高效算法解决方案。堆用于Dijkstra算法求解最短路径,例如在图论问题中;PriorityQueue则在多线程下载管理中确保高优先级任务优先执行。这两个数据结构提升效率,简化代码,是编程中的强大工具。
69 0
|
7月前
|
算法 Java 调度
Java数据结构与算法:优先队列
Java数据结构与算法:优先队列
|
7月前
|
算法 C++
【洛谷 P1090】[NOIP2004 提高组] 合并果子(贪心算法+哈夫曼编码+优先队列)
该编程题目要求设计算法,将不同种类的果子合并成一堆,使得消耗的体力最小。给定果子种类数`n`(1至10000)和每种果子的数量,需输出合并的最小体力值。使用优先队列(最小堆),每次取出两个数量最少的果子堆合并,并更新总体力消耗。样例输入为3种果子(1, 2, 9),输出最小体力耗费为15。提供的AC代码采用C++实现,通过优先队列优化合并顺序。
94 0
|
7月前
|
存储 算法 Java
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
面试高频算法题汇总「图文解析 + 教学视频 + 范例代码」之 二分 + 哈希表 + 堆 + 优先队列 合集
|
7月前
|
算法 C语言
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
数据结构和算法——归并排序(有序子列的归并、递归算法、非递归算法、思路图解、C语言代码)
44 0

热门文章

最新文章