【问题标题】:Why is the array access 6NlogN in a Top-down mergesort?为什么在自上而下的归并排序中数组访问 6NlogN?
【发布时间】:2017-07-09 05:26:12
【问题描述】:

我不太明白为什么要通过自上而下的归并排序对长度为 N 的数组进行排序,它只需要 6NlogN 次数组访问。 (每关需要6N,高度是lgN,所以一共是6NlgN)

每次合并最多使用 6N 次数组访问(2N 用于复制,2N 用于后移,最多 2N 用于比较)

不是把N个元素复制到辅助数组中再复制回原来的数组,也就是2N吗? 2N“后退”从何而来?

这个问题实际上来自算法合并排序中的 Progosition G。我想为此。

就是下面书中的代码:

public static void merge(Comparable[] a, int lo, int mid, int hi) 
{  // Merge a[lo..mid] with a[mid+1..hi].
   int i = lo, j = mid+1;
   for (int k = lo; k <= hi; k++)  // Copy a[lo..hi] to aux[lo..hi].
      aux[k] = a[k];
   for (int k = lo; k <= hi; k++)  // Merge back to a[lo..hi].
      if      (i > mid)              a[k] = aux[j++];
      else if (j > hi )              a[k] = aux[i++];
      else if (less(aux[j], aux[i])) a[k] = aux[j++];
      else                           a[k] = aux[i++]; 
}

public class Merge 
{  
   private static Comparable[] aux;      // auxiliary array for merges
   public static void sort(Comparable[] a)
   {
      aux = new Comparable[a.length];    // Allocate space just once.
      sort(a, 0, a.length - 1);
   }
   private static void sort(Comparable[] a, int lo, int hi)
   {  // Sort a[lo..hi].
      if (hi <= lo) return;
      int mid = lo + (hi - lo)/2;
      sort(a, lo, mid);       // Sort left half.
      sort(a, mid+1, hi);     // Sort right half.
      merge(a, lo, mid, hi);  // Merge results (code on page 271).
   } 
}

【问题讨论】:

    标签: arrays algorithm merge mergesort array-merge


    【解决方案1】:

    我可以看到,您只将读取操作称为“数组访问”,而本书将读取和写入操作都称为“数组访问”。 查看merge 代码。您在这里有 2 个数组访问:

    aux[k] = a[k];
    

    a 的读取操作和对aux 的写入操作。那么这里:

    a[k] = aux[j++]; //or aux[i++];
    

    您还有另外两个,这次是在 aux 上读取和在 a 上写入。最后,您可能还会在这里阅读两篇文章:

    less(aux[j], aux[i])
    

    总而言之:6 次数组访问(4 次读取和 2 次写入)。

    正如您所提到的,算法深度为 logN,因此我们得到 6NlogN。

    【讨论】:

    • 哦,是的。我完全没有意识到这一点。非常感谢您指出这一点,不胜感激:)
    • 很高兴能帮上忙!顺便说一句 - 如果它确实解决了您的问题,请接受答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 2017-02-02
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多