Algorithm 合并排序的大复杂性

Algorithm 合并排序的大复杂性,algorithm,sorting,time-complexity,big-o,Algorithm,Sorting,Time Complexity,Big O,我有一个关于合并排序的大Oh的讲座,我很困惑 所显示的是: 0合并[]=n 1合并[]=(n/2+n/2)=n 2次合并[n/4][n/4][n/4][n/4]=2(n/4+n/4)=n log(n)merges=n 总计=(n+n+n+…+n)=lg n =O(n对数n) 我不明白为什么(n+n+…+n)也可以表示为n的对数基数2,以及它们是如何得到2个合并=2(n/4+n/4)你的树有一个深对数(n)和一个宽n.:) 日志部分是“在只剩下一个元素之前,我可以将数据分成两部分多少次?”这是递

我有一个关于合并排序的大Oh的讲座,我很困惑

所显示的是:

0合并[]=n

1合并[]=(n/2+n/2)=n

2次合并[n/4][n/4][n/4][n/4]=2(n/4+n/4)=n

log(n)merges=n

总计=(n+n+n+…+n)=lg n =O(n对数n)


我不明白为什么(n+n+…+n)也可以表示为n的对数基数2,以及它们是如何得到2个合并=2(n/4+n/4)

你的树有一个深对数(n)和一个宽n.:)

日志部分是“在只剩下一个元素之前,我可以将数据分成两部分多少次?”这是递归树的深度。n的倍数来自这样一个事实:对于树中的每一个级别,您将在该级别上的所有合并步骤之后查看数据集中的每个元素

recurse downwards:
    n unsorted elements
  [n/2][n/2] split until singletons...
  ...
merge n elements at each step when recursing back up
  [][][]...[][][]
  [ ] ... [ ]
  ...
  [n/2][n/2]
  n sorted elements

在1合并的情况下,有两个子数组需要排序,其中每个子数组需要的排序时间与n/2成比例。从这个意义上讲,要对这两个子数组进行排序,需要与n成比例的时间

类似地,当您进行2次合并时,将对4个子数组进行排序,其中每个子数组将花费与n/4成比例的时间,这将再次汇总为n

类似地,如果有n合并,则需要与n成比例的时间对所有子数组进行排序。从这个意义上讲,我们可以将merge sort所花费的时间写如下

T(n)=2*T(n/2)+n

您将了解,此递归调用可以深入(例如高度h)直到
n/(2^h)=1
。通过在这里取log,我们得到h=log(n)。这就是log(n)如何来到现场的。此处log取自基数2

由于您有log(n)步骤,其中每个步骤所花费的时间与n成比例,因此所花费的总时间可以表示为

n*log(n)

在大O表示法中,我们将其作为上界
O(nlog(n))
。希望你有这个想法

下面的递归树图像将进一步启发您。
在你的问题中写的以下部分的最后一行

0合并[]=n

1合并[]=(n/2+n/2)=n

2次合并[n/4][n/4][n/4][n/4]=2(n/4+n/4)=n

n merges=n——这行不正确

这是错误的。您将不会有大小为n的总共n个合并,而是大小为n的日志n个合并

在每个级别上,您将问题大小划分为两个大小为一半的问题。当你继续潜水时,你能做的总分割是对数n。(怎么做?假设可能的总分割数是x,那么n=2x或x=Log2n。)


因为在每个级别上,您总共做了O(n)个功,因此对于Log n级别,所有完成的功的总和将是O(n Log n)。

这非常简单。正如您所演示的,每次合并都采用O(n)。您需要执行的合并数是log n(以2为基数),因为每次合并都会使已排序的节的大小加倍。

log(n)的深度是多少?对于这个令人困惑的答案,很抱歉@Imesha Sudasingha带来了一张关于深度和宽度的可爱图表。他们告诉我们,很明显,它也可以写得同样大哦:哦,也许,从来没有看到过它,n的基数2是分裂数据集的次数,直到只剩下单例。每个级别都有“n”,因为在特定级别的所有合并步骤中,您最终会迭代每个子数组的整个部分。我承认,伊姆沙的回答更为具体。希望我能帮上一点忙。你是以某种方式生成了这棵树还是找到了它?我很好奇。@synchronizer:这是一张常见的图片。我在我自己的一本书里用过。