【问题标题】:How can we conclude to this cost?我们如何得出这个成本的结论?
【发布时间】:2014-07-27 17:14:57
【问题描述】:

我想求出以下合并排序算法的代价:

  Merge(A,p,q,r)
       n1=q-p+1;
       n2=r-q;
       We create the sequences:
       L[1 .... n1+1] and R[1.... n2+1]
       for i<-1 to n1
           L[i]<-A[p+i-1]
       for j<-1 to n2
            R[j]<-A[q+j]
       L[n1+1]<-oo  ,   R[n2+1]<-oo   ( sentinel elements )

       Composition:
       i<-1, j<-1
       for k<-p to r
          if L[i]<=R[j] then
              A[k]<-L[i]
              i<-i+1
          else
              A[k]<-R[j]
              j<-j+1


    MERGESORT(A,p,r)
       if p<r then
          q<-floor((p+r)/2)
          MERGESORT(A,p,q)
          MERGESORT(A,q+1,r)
          Merge(A,p,q,r)

根据我的课本,成本是T(n)=2T(n/2)+cn,n>1 and T(n)=c,n=1

但我还没有真正理解我们如何得出这种关系。

你能给我解释一下吗?

【问题讨论】:

    标签: sorting mergesort


    【解决方案1】:
    T(n) = 2T(n/2) // two reucrsive calls, each on half the array
         + cn      // the cost of merge. Merge runs in linear time.
    

    我们可以这样写

    T(n) = O(nlogn)
    

    因为

    T(n) = 2T(n/2) + cn 
         = 4T(n/4) + cn + cn 
         = 8T(n/8) + cn + cn + cn 
         = ... (after log times)
         = n*T(n/n) + cn + cn + cn + ... + cn (where cn appears log(n) times)
         = c*logn*n
    

    【讨论】:

    • 要得出 Merge 函数的成本为 O(n) 的结论,我们是否只计算 for 循环运行的次数而忽略控制和分配的数量,还是必须采取这些也考虑?
    • 没关系,在这两种情况下,你得到的结果都是输入元素数量的线性函数。
    • 因为分配和控制的成本只是常数,我们只考虑度数最高的项?
    • 还是常数之和,没关系。
    • Tohava 另外,如果 n=1,它是 T(n)=c,根据我的教科书..为什么不是 T(1)=1,因为在这种情况下,我们只检查 p
    【解决方案2】:

    在每次递归中,您都将大小为 n 的问题 T(n) 拆分为 两个 问题 T(n/2 ) 的大小为 n/2,因此您得到 2*T(n/2)。在最后一次递归之后,您必须将已排序的列表重新合并在一起。合并排序列表在O(n)中完成,相当于c*n

    所以总成本是T(n)=2T(n/2)+cn

    【讨论】:

    • 要得出 Merge 函数的成本为 O(n) 的结论,我们是否只计算 for 循环运行的次数而忽略控制和分配的数量,还是必须采取这些也考虑?
    • 要合并两个排序列表,您只需在两个列表中运行一次。
    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 2011-01-31
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    相关资源
    最近更新 更多