这是一个课堂作业,所以我不是在寻找解决方案,只是帮助确定我们是否在正确的轨道上,以及一些正确方向的指针。
我们将设计一种算法来查找数组中的三个最小元素。我们必须使用分而治之的范式。数字必须以三元组排序。该算法必须在最差的线性时间内运行。输入可以假定大小为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)
不幸的是,我们很困惑如何使用这种重复来通过归纳证明我们的运行时间。
任何帮助将不胜感激。请问我是否遗漏了任何东西。