将k列表与o合并(nlogk)

时间:2010-06-26 15:52:58

标签: algorithm merge analysis

Merge算法的运行时间是否为O( n log k )?

  • k 是列表的数量。
  • n 是所有列表中元素的总数( n = n 1 + < em> n 2 + ... + n k )。

algorithm MakingAHalf(List_Of_Lists)
    if List_Of_Lists.size() = 1
        return the only list in List_Of_Lists
    else
        split List_Of_Lists into two halfs (First_Half and Second_Half)
    MakingAHalf(First_Half)
    MakingAHalf(Second_Half)
    Merge(First_Half, Second_Half, Min_Heap)

algorithm Merge(First_Half, Second_Half, Min_Heap)   //T(n) = O(n log k)?
    while First_Half  is not empty and First_Second is not empty do
        if First_Half.first().element() < Second_Half.first().element() then
            Insert(Min_Heap, First_Half.remove(First_Half.first()))
        else
            Insert(Min_Heap, Second_Half.remove(Second_Half.first())  
    while First_Half is not empty do
        Insert(Min_Heap, First_Half.remove(First_Half.first()) 
    while Second_Half is not empty do
        Insert(Min_Heap, Second_Half.remove(Second_Half.first())

algorithm Insert(A, key)
    A[n+1] <-- key
    while (i > 1) and (A[i] > A[[i/2]]) do
        swap A[i] and A[[i/2]]
        i <-- i - 1

2 个答案:

答案 0 :(得分:1)

看看你的代码,你似乎对minHeaps是什么感到非常困惑。你所拥有的代码是非常错误的,并且谈论将合并排序边界变为毫无意义的时间复杂性。

你的Merge方法没有做任何事情来合并两个列表,所有它正在做的是将元素插入到MinHeap中,并且也按排序顺序插入!这看起来完全没有意义。

如果你使用MinHeap作为一个可以访问所有调用的堆并稍后从中读取它,那么它是O(n logn),因为你将n个项插入堆中并且你并不真正需要所有这些递归调用,只需逐个插入它们!

由于这看起来像是作业,我只会给你一个提示:在任何时候,堆中的元素不应超过k个。

答案 1 :(得分:0)

合并为O(log N),MergeSort为O(NlogN)。 HeapSort是另一种算法。