我有这个丑陋的算法(是的,它是一门计算机科学课程,所以它的目的很难看)。我们必须使用不同的方法找到它的复杂性。其中一种方法是向后替换。通过查看算法,很明显它的复杂性将位于(log(n - m))范围内,因为每次递归调用时实例大小除以3。
Function WeirdSort(Array[m..n])
if (m < n) then
if (A[m] > A[n]) then
temp = A[m]
A[m] = A[n]
A[n] = temp
end if
if (m + 1 < n) then
index = floor((n - m + 1) / 3)
WeirdSort(A[m..n - index])
WeirdSort(A[m + index..n])
WeirdSort(A[m..n - index])
end if
end if
end Function
但我试图了解如何通过向后替换方法达到这个答案。更具体地说,我一直试图处理开始显示数组大小的众多floor()和ceiling(),以及我应该如何处理它们。
我的直觉告诉我,他们不能被抛到一边,但也许这就是我应该做的事情?
另外,考虑到如果数组已经排序,算法没有提前结束的事实,我认为最坏和最好的情况是相同的,但这也可能是错误的。
答案 0 :(得分:1)
很抱歉告诉您,但复杂性远离log(x)
。
假设最坏的情况,m=1
你做的是2/3的元素3次递归。
T(n) = 3*T(2n/3) + 1
使用master theorm ==>
T(n) = O(n^2.7~)