时间复杂度如何从蛮力变为递归解决方案?
Posted
技术标签:
【中文标题】时间复杂度如何从蛮力变为递归解决方案?【英文标题】:How would the time complexity change from brute force to recursion solution? 【发布时间】:2015-08-10 03:55:48 【问题描述】:这是我正在解决的问题
我实施了蛮力解决方案和分而治之(递归)解决方案。他们都使用这个输入(从帖子 1 到 4)
对于蛮力解决方案,我所做的是生成 1,2,3,4 的所有子集,遍历所有子集并仅检查包含 1 和 4 的子集。我知道我的蛮力解决方案将在 O(2n) 时间内运行,因为数学上有 2n 个子集,我必须迭代全部。
对于我的递归解决方案。我所做的是分解这个问题,以便生成/将检查的唯一解决方案是包含 1 和 4 的解决方案。例如,从 1 可以转到 2、3、4,如果转到 2,您可以转到 3,4,依此类推...直到达到 4。
在分析了这两种算法之后,我意识到唯一的区别是分而治之甚至不会检查没有 1 和 4 的子集,但蛮力会检查 2,3。这种差异将如何影响递归算法的时间复杂度。递归算法是否也会在 O(2n) 或更少的时间内运行,因为它检查的子集更少?
【问题讨论】:
似乎是动态规划的经典问题,因为问题具有最优子结构。 (或者只是将问题简化为 DAG,然后运行最短路径问题算法)。 属于cs.stackexchange.com 这里的主题也很完美,在算法标签下。它询问如何解决可以用任何编程语言计算的问题。 @amit 是的,动态编程是下一步。我认为这更像是一个进步,可以帮助您了解递归、蛮力和动态之间的区别 @amit 你知道运行时是什么吗?其余答案尚不清楚/尚未解决。 【参考方案1】:递归优化的额外步骤是使用记忆。推理是 - 一旦你到达并停在 x 后,无论你来自哪里,它总是相同的成本直到结束。 事实证明,只需要以索引 i 最低价格保持数组即可结束。这可以在 O(n²) 时间内从右到左填充。
【讨论】:
它不问如何优化它,它问的是分治法的运行时间。【参考方案2】:存在一个简单的动态规划解决方案。
将每个连续更长的最佳独木舟旅程视为一些更短的最佳独木舟旅程的函数。即,前往邮局 4 的最便宜方式是前往邮局 3 的最便宜方式加上区间 3 到 4 的最佳决策。然后考虑到达邮局 5 的最便宜方式作为先前计算的最便宜的访问方式的函数发布 4.
在代码中实现这个递归,你的解决方案应该是 O(n^2),类似于常年 CLRS 的最爱:切杆问题:http://www.geeksforgeeks.org/dynamic-programming-set-13-cutting-a-rod/
分而治之的方法将检查启动租赁的单件,然后“合并”步骤将优化新的双件/4 吨/等。它会比 O(2^n) 好得多,因为您不会重新计算每个子路径的所有可能性,但它是一种贪婪算法——它在获得关于答案的完美信息之前对答案做出假设。
如果您假设最佳决策发生在子集的某些合并步骤中,您必然会错过在 1 时租船并在 n 时返回它是最佳解决方案的情况,但运行时间为 O(n log n) .但是,如果您检查输入并针对每个合并进行优化,您将回到 O(2^n)。
【讨论】:
这个问题问的是一些非常具体的事情,而不是如何解决它。它没有回答关于分而治之方法的运行时间的问题 编辑以反映这一点。 @quietudecircuit 你能举一个失败的例子吗?我同意这是贪婪的,因为您正在寻找最低成本,但我没有看到失败的情况 - 您正在经历所有可能的路径。 编辑了更多解释。 关于“如果您检查输入并针对每次合并进行优化”,我是否在分而治之的方法中这样做了?输入是否只是指每个可能的路径?以上是关于时间复杂度如何从蛮力变为递归解决方案?的主要内容,如果未能解决你的问题,请参考以下文章