Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Mergesort可对三个输入数组进行排序_Algorithm_Arrays_Sorting_Performance_Asymptotic Complexity - Fatal编程技术网

Algorithm Mergesort可对三个输入数组进行排序

Algorithm Mergesort可对三个输入数组进行排序,algorithm,arrays,sorting,performance,asymptotic-complexity,Algorithm,Arrays,Sorting,Performance,Asymptotic Complexity,合并算法通过重复比较两个输入数组中最小的元素,并将其中较小的元素移动到输出数组中,将两个已排序的输入数组合并为一个已排序的输出数组 现在我们需要将三个相同长度的排序输入数组(A1、A2和A3)合并到一个(排序的)输出数组中,有两种方法: 使用上述合并算法将A1和A2合并到A4中,然后使用相同的算法将A4和A3合并到输出数组中 通过反复比较三个输入数组中的最小元素,并将三个数组中的最小元素移动到输出数组,修改上述合并算法 如果只考虑数组元素移动(即赋值)的最坏情况,上述两种算法中哪一种更有效 如果

合并算法通过重复比较两个输入数组中最小的元素,并将其中较小的元素移动到输出数组中,将两个已排序的输入数组合并为一个已排序的输出数组

现在我们需要将三个相同长度的排序输入数组(A1、A2和A3)合并到一个(排序的)输出数组中,有两种方法:

  • 使用上述合并算法将A1和A2合并到A4中,然后使用相同的算法将A4和A3合并到输出数组中

  • 通过反复比较三个输入数组中的最小元素,并将三个数组中的最小元素移动到输出数组,修改上述合并算法

  • 如果只考虑数组元素移动(即赋值)的最坏情况,上述两种算法中哪一种更有效

    如果只考虑阵列元素比较的最坏情况,上述两种算法中哪一种更有效


    在这两种算法中,哪一种在最坏的情况下总体效率更高?

    如果您只关心数组写入的数量,那么第二种算法(三路合并)比第一种算法(两个双向合并实例)更快。三路合并算法将精确执行3n次写入(其中n是任何序列的长度),因为它在一次过程中合并所有三个范围。第一种方法将两个范围合并在一起,进行2n次写入,然后将该序列与第三个序列合并,进行3n次写入,总共进行5n次写入

    更一般地说,假设有k个元素范围,全部长度为n。如果你两两合并这些范围,然后再两两合并这些合并,等等,那么你将大致执行k/2合并步骤合并长度为n的范围,然后k/4合并长度为2n的范围,然后k/8合并长度为4n的范围,等等。这给出了总和

    kn/2+kn/2+…+kn/2(对数n次)

    对于净数组写入数为O(kn lg n)的情况。另一方面,如果在每一步都使用k-way比较,则只需进行kn写入,这要小得多

    现在,让我们考虑一下在每个设置中进行了多少比较。在三向合并中,写入输出序列的每个元素都需要找到三个值中的最小值。这需要两个比较—一个比较前两个序列的第一个值,另一个比较这两个值中的最小值与第三个数组的第一个值。因此,对于写入结果序列的每个值,我们使用两个比较,由于写入了3n个值,我们需要总共进行最多6n个比较

    一个更好的方法是将序列存储在一个最小堆中,在这个堆中,序列通过它们的第一个元素进行比较。在每一步中,我们使用最小的第一个值从堆中取出序列,将该值写入结果,然后将序列的其余部分重新排入堆中。对于k序列,这意味着写出的每个元素最多需要O(lgk)比较,因为堆插入在O(lgk)中运行。这给出了O(kn lg k)的净运行时间,因为写出的每个kn元素都需要O(lg k)处理时间

    在另一个版本中,我们首先执行一个标准的双向合并,它要求每个写出的元素进行一次比较,总共进行2n次比较。在合并的第二个过程中,在最坏的情况下,我们总共进行了3n次比较,因为合并了3G元素。这提供了总共5n次的净比较。如果我们使用上述两两合并的广义构造,我们将需要使用O(kn lgn)比较,因为写入的每个元素都需要一个比较,而我们需要O(kn lgn)写入

    简言之,对于k=3的特定情况,对于9n个内存读取和写入的网络,三向合并进行3n次写入和6n次比较。迭代双向合并对总共10n个内存读写进行5n次写入和5n次比较,因此三向合并版本更好

    如果我们考虑广义构造,k路合并做O(NK)写和O(NK LG K)比较,用于O(NK LG k)存储器操作的总数。迭代双向合并算法对总共O(nk lg n)个内存操作执行O(nk lg n)写入和O(nk lg n)比较。因此,对于一些长序列,k-way合并渐进地更好,而对于许多短序列,迭代合并排序更快


    希望这有帮助

    “请详细解释”?真的吗?这看起来像是抄袭/粘贴的家庭作业。没有人会为你做这件事,但是如果你解释你目前所理解的,有些人可能会告诉你哪里是对的,哪里是错的。“请表现出一些努力!”蜥蜴比尔:你击中了它的鼻子。我知道这很旧,但你不必总是在三重合并排序的每一步做三次比较。在某些情况下,您只需要2个值:(1)上一步的第二个max元素和(2)列表中的下一个值,该值来自上一步的max元素