确定mergesort的调用次数(激活次数)

时间:2015-05-11 02:50:47

标签: algorithm big-o mergesort

我正在攻读CS 125期末考试,并且简要介绍了Big O Notation。

鉴于:

  • Mergesort的运行时间最佳情况为O(N lg(N)),运行时间最差情况为O(N lg(N))
  • 有32个浮点值,最初是随机顺序,存储在双数组

如果要对数组进行排序,那么mergesort的总调用次数(激活次数)是多少?假设基本案例对单个值进行排序。

我会继续说,只需将32插入最坏情况或最佳情况(因为mergesort保证O(N lg(N))。

这不能给我正确的解决方案(显然是31)。有人可以提供一些指示或解释吗?我只是没有看到它。

2 个答案:

答案 0 :(得分:3)

当32是2 5 时,递归树将是完整的二叉树。然后我们对mergesort进行1 + 2 + 4 + 8 + 16 + 32 = 63次调用。我不清楚为什么答案是31,当他们说基本情况是长度为1.显然他们不计算最后一级递归(或者他们假设你不会在长度为0时递归1)。

在您的原始尝试中,您将使用递归调用混淆运行时间。 Mergesort的O(n log n)是算法所做的元素之间比较次数的上限。因为我们想要计算递归调用的数量,知道这个绑定对我们没有任何好处(虽然知道算法如何工作)。

答案 1 :(得分:0)

因此,mergeSort 方法完成拆分工作,merge 方法完成征服工作。

对于 32 的列表大小,我认为有 63 次 mergeSort 调用,即 2 * 32 - 1 = 63。还有 31 次合并调用,即 32 - 1 = 31。