gpt4 book ai didi

arrays - 为什么数组在自上而下的合并排序中访问 6NlogN?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:42:42 25 4
gpt4 key购买 nike

我不太明白为什么要用自上而下的归并排序对长度为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).
}
}

最佳答案

我所看到的是您只将读取操作称为“数组访问”,而本书将读取和写入操作都称为“数组访问”。查看 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。

关于arrays - 为什么数组在自上而下的合并排序中访问 6NlogN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42335993/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com