请问这里有人看Introduction to Algorithms么,看看这道题怎么解

hokohuang 2009-02-16 09:50:15
因为数据结构这块放下有点时间了,有的东西不太确定,周围也没老师, 发这里向大家请教。

题目就是书中6.5-8,看过的朋友
Give an O(n lg k)-time algorithm to merge k sorted lists into one sorted list, where n is the total number of elements in all the input lists. (Hint: Use a min-heap for k-way merging.)

我的思路是,先将k个 有序列分别整理成 minheap, 然后将每个minheap的指针存放在一个数组S里,判断S里元素大小的依据是 其minheap的根大小, 以此把这个数组S再整理成minHeap。下面进行n次循环,每次循环从大minheap S中提取根元素——某个小minheap(指针),然后从这个小minheap中提取根元素,由此完成一个元素的merg。
不知道这样想对不对,代码即使用pseudocode 来描述也比较繁琐,所以有点怀疑
...全文
158 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
BusyCai 2009-02-17
  • 打赏
  • 举报
回复
1 取K条链表的第1个元素,共K个元素,建最小堆。
2 去掉堆顶元素,加入堆顶元素所在链表的下一个元素,入堆,调整,再去掉堆顶元素。如果所在链表没有下一元素,堆的规模减1
3 循环2直到所有的链表均已处理完毕。

复杂度分析:共需要遍历所有的n个元素,而且调整堆的时间复杂度为logk,所以一共是nlogk
losedream 2009-02-17
  • 打赏
  • 举报
回复
奇怪为什么要用heap
楼主有否做过另外一道crs的习题,即用n + lgn - 2 comparisons to find the largest and second largest elements of an array of length n.
Similary for this problem, at the first time merge two length k array, then get n/2*k of length 2k, next time, get n/4k of length 4k. keep doing this till the end. This has depth of lgk and at each level O(n) time is spent. Hence totally nlgk complexity.

为了赚积分只好不潜水了 sigh

hokohuang 2009-02-17
  • 打赏
  • 举报
回复
谢谢litaoye的分析,整理成heap 我想是为了结构上清晰点, 如果直接数组的话,每个数组还要有个当前最小值序号的跟踪器
gbb21 2009-02-16
  • 打赏
  • 举报
回复
粗略看来,应该是对的~
qq675927952 2009-02-16
  • 打赏
  • 举报
回复
up
绿色夹克衫 2009-02-16
  • 打赏
  • 举报
回复
LZ的思路挺不错,不过没有必要将k个序列整理成minheap,因为本来就有序了!

将k的序列中最小的元素提出来建堆,如果最小根对应的元素属于Array[i],则从Array[i]中再找第2小的补充进来。

以此类推,所以是n*logk

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧