利用归纳法(找到3个最小的数组元素)证明分治算法的时间复杂度

时间:2019-03-14 17:24:42

标签: recursion time-complexity divide-and-conquer induction proof-of-correctness

这是一个课堂作业,所以我不是在寻找解决方案,只是帮助确定我们是否在正确的轨道上,以及一些正确方向的指针。

问题

我们将设计一种算法来查找数组中的三个最小元素。我们必须使用分而治之的范式。数字必须以三元组排序。该算法必须在最差的线性时间内运行。输入可以假定大小为3 * 2 ^(k-1)

必须(通过归纳法)证明其正确性和运行时间。

我们当前的解决方案

def FindSmallest(list):
   if list.size <= 3:
      Sort(list)
      return list

   L = FindSmallest(list / 2)
   R = FindSmallest(list / 2)

   Triple = Merge(L, R)
   return Triple

算法的伪代码实现。

理论

我们将原始问题递归地分为两部分,直到子问题的大小为3。接下来,我们对子问题进行排序。在递归堆栈中向上移动,我们将大小为3的子问题合并在一起(包括两个子问题中的3个最小的元素),直到只剩下容器,并以Triple的形式返回。

排序

由于排序是在固定大小(3)的容器上完成的,因此我们认为它们的运行时间将是恒定的;最多3个比较和3个交换。

合并

将大小为3的两个排序数组合并在一起也应该花费固定的时间。由于我们不是就地合并,因此该过程应进行3个比较和3个分配。合并后的容器的大小将为3。

时间兼容性

部门/合并数:(n / 3)-1

子问题/排序次数:(n / 3)

重复公式

我们相信这种重复性将适用于我们的算法:

T(n)= 2T(n / 2)+ 2(2n-3)

不幸的是,我们很困惑如何使用这种重复来通过归纳证明我们的运行时间。

任何帮助将不胜感激。请问我是否遗漏了任何东西。

0 个答案:

没有答案