【问题标题】:Worst-case running time of divide and conquer algorithm分治算法的最坏情况运行时间
【发布时间】:2015-07-10 03:47:10
【问题描述】:

我是一名正在学习编程课程数据结构和算法的学生,我需要帮助解决我似乎无法掌握的考试问题。

问题来了:

考虑以下算法 func 在给定数组 A = {a1, a2, ..., an} 上:

  • 如果 n = 1,则返回。

  • 如果a1 > an,则交换a1和an。

  • 在 {a1, a2, ... ,a2n/3} 上运行 func

  • 在 {an/3, a(n/3)+1, ... ,an} 上运行 func

  • 在 {a1, a2, ... ,a2n/3} 上运行 func

给出该算法的最坏情况运行时间的递归。

如果我的解释不清楚,这里是作业图片的链接:http://i.imgur.com/VftEgDX.png

我知道这是一个分而治之的问题,但我很难弄清楚如何解决它。

谢谢你:)

【问题讨论】:

  • 因此,作为长度函数的操作数可以用递归T(n) = 3 T(2n/3) + 1 表示,基本情况为T(1) = 1。这足以让你继续前进吗?
  • 嗯...有点!但我真的不明白 {an/3, a(n/3)+1, ... ,an} 是如何变成 T(2n/3)..

标签: algorithm data-structures divide-and-conquer


【解决方案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 获得一个大 O 表示法:

log_{3/2}(3) ~= 2.7

O(1) 在O(n^2.7) 中,所以我们可以使用大小写,得到T(n)

Theta(n^log_{3/2}(3)) ~= Theta(n^2.7)

【讨论】:

  • 哇,这比我想象的还要先进!不要认为我们一直在处理主定理案例。不过感谢您的帮助!你能解释一下为什么 {an/3, a(n/3)+1, ... ,an} 会变成 T(2n/3) 吗?
  • 因为它包含 2n/3 个元素,即索引为 n/3,n/3+1 , ..., n-1,n 的元素,并且您在这 2n/3 个元素上递归调用该函数。
  • 好的,谢谢!那么这个算法最坏情况的运行时间是Theta(n^2.7)?将不得不阅读更多关于主定理的案例。
  • 大约 Theta(n^2.7),其实是Theta(n^log_{3/2}(3))。这也是算法的平均情况。
  • 非常感谢您的帮助,我真的很感激!
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多