Algorithm 合并排序的空间复杂性

Algorithm 合并排序的空间复杂性,algorithm,space-complexity,Algorithm,Space Complexity,我对合并排序的空间复杂性感到有些困惑。它说它是O(n)。但是,如果我看一下wiki中的实现,它看起来是O(nlogn) 这是因为在每次递归调用时,我将数组分为左和右。例如,让我们从第一次调用合并排序开始。它将数组分成左右两半,我们已经需要n个空间。正如您在wiki实现中所看到的,它创建了两个新数组来容纳左右部分 现在,对右半部和左半部进行了两个递归调用,它们将自己的部分划分为左半部和右半部,这将再次占用空间n,将四个新的半部合并起来,依此类推 由于所有这些都是递归调用,因此堆栈中的内存会一次又一

我对合并排序的空间复杂性感到有些困惑。它说它是O(n)。但是,如果我看一下wiki中的实现,它看起来是O(nlogn)

这是因为在每次递归调用时,我将数组分为左和右。例如,让我们从第一次调用合并排序开始。它将数组分成左右两半,我们已经需要n个空间。正如您在wiki实现中所看到的,它创建了两个新数组来容纳左右部分

现在,对右半部和左半部进行了两个递归调用,它们将自己的部分划分为左半部和右半部,这将再次占用空间n,将四个新的半部合并起来,依此类推

由于所有这些都是递归调用,因此堆栈中的内存会一次又一次地消耗,并累积到O(nlogn)。所以我认为这个特定实现的空间复杂度是O(nlogn)


请提供一些见解?

你很接近了。如果包含递归调用的空间,则是O(n)+O(logn),它=O(n)。希望这能解决你的问题


有关详细信息,请参阅。

我没有收到。从表面上看,它看起来是O(n+n/2+n/4..1),基本上是O(n)。对于eg,如果初始输入大小为8。递归调用将保持8-4-2-1的状态。我认为如果n=8,这是不正确的。那么O(8+4+2+1)=O(15)不等于O(8+log(8)),也就是O(8+3)=O(11)。我不知道如何进一步澄清它。当n趋于无穷大时,由于O(n)的空间复杂度加在O(log(n))上,占主导地位的项占据了主导地位,由此产生的空间复杂度为O(n)。基本上,因为每个项n没有使用log(n)空间,所以它不是O(nlog(n))。对于整个集合n,需要额外的日志(n)空间。我推荐我链接的帖子。它们会更详细。不幸的是,我得走了,所以我暂时不能回答更多的问题。你说的最后一部分我已经讲完了。更大的术语占主导地位。但是对于wiki的这个特定实现,我认为它不是O(n+log(n))。我只是想准确地纠正一下。这绝对不是O(n+logn)。这里哪个wiki是“wiki”?