我是一名正在学习编程课程数据结构和算法的学生,我需要帮助解决一个我无法解决问题的考试问题。
问题在于:
在给定数组上考虑以下算法 func A = {a1,a2,...,an}:
如果n = 1,则返回。
如果a1> an,然后交换a1和a。
在{a1,a2,...,a2n / 3}上运行 func 。
在{an / 3,a(n / 3)+1,...,an}上运行 func 。
在{a1,a2,...,a2n / 3}上运行 func 。
对此算法的最坏情况运行时间进行重复。
如果我的解释不清楚,可以使用指向图片的链接:http://i.imgur.com/VftEgDX.png
我知道这是一个分而治之的问题,但我很难弄清楚如何解决它。
谢谢:)
答案 0 :(得分:1)
If a1 > an, then exchange a1 and an.
这是一个常数操作 - 所以O(1)
Run func on {a1, a2, ... ,a2n/3}.
你在2n / 3上递归调用数组,所以T(2n / 3)
Run func on {an/3, a(n/3)+1, ... ,an}.
Run func on {a1, a2, ... ,a2n/3}.
与上述类似,每一个都是T(2n / 3)
这总计为T(n) = 3T(2n/3) + O(1)
和T(1) = O(1)
。
现在,我们可以使用master theorem case 1:
获得一个很大的符号log_{3/2}(3) ~= 2.7
O(1)位于O(n^2.7)
,因此我们可以使用该案例,并获取T(n)
位于
Theta(n^log_{3/2}(3)) ~= Theta(n^2.7)