将我的算法解决方案与教科书进行比较

时间:2017-02-07 02:57:49

标签: algorithm

我正在解决Cracking the Coding Interview中的问题,如下所示:

一位受欢迎的女按摩师会收到一系列背对背的约会请求,并在争论接受哪些请求。她需要在约会之间休息15分钟,因此她不能接受任何相邻的请求。给定一系列背对背约会请求(所有15分钟的倍数,非重叠,并且不能移动),找到女按摩师可以尊重的最佳(最高总预定分钟数)。返回分钟数。

实施例

输入:{30,15,60,75,45,15,15,45} 输出:180分钟({30,60,45,45})

输入:[75,105,120,75,90,135] 输出:[75,120,135]

我的递归解决方案围绕以下内容展开:

  • 选择arr [0],并调用maxVal(index + 2) vs maxVal(index + 3)
  • 为arr [1]做同样的事情arr [0]。在这两个初始启动之后,算法的其余部分是等效的(即对于arr [0]和arr [1]的两个起点,maxVal(指数+ 2) vs maxVal(指数+3) ])

因此,每个元素都可以选择跳过2或跳过3。

教科书递归解决方案的工作原理如下:

  • maxVal = maxVal(index + 2)+ arr [index0] vs maxVal(index + 1)

我的算法在某种程度上是不正确的吗?或者它只是处理问题的同样最佳方式?两个算法不应该是没有记忆的O(2 ^ N),O(N)和记忆吗?

1 个答案:

答案 0 :(得分:1)

你的算法虽然比较复杂,但却是正确的。它没有考虑没有相邻元素的每个子集,但它没有考虑的那些不是最大的,因此不是最优的,因为约会时间都应该是正的。

没有记忆的给定解的运行时间更精确地是Theta(Fib(n)),其中Fib(n)是第n个Fibonacci数(约O(1.62 ^ n))。你的再现是

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

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

取决于您是否重复使用maxVal(index + 3)的计算。前一个实现及时运行O(1.47 ^ n);后者,O(1.72 ^ n)。