为什么分治算法经常比暴力算法运行更快?例如,要查找最近的点对。我知道你可以向我展示数学证明。但直觉上,为什么会发生这种情况?魔法吗?
从理论上讲,“分而治之总是比暴力求解更好”这种说法是否正确?如果不是,是否存在反例?
从理论上讲,“分而治之总是比暴力求解更好”这种说法是否正确?如果不是,是否存在反例?
对于您的第一个问题,分治算法背后的直觉是,在许多问题中,必须要处理的工作量基于输入的某种组合属性,并且具有大于线性的规模。
例如,在最近点对问题中,暴力答案的运行时间取决于您必须查看所有O(n2)个点对。
如果将二次增长的东西分成两部分,每个部分的大小都是之前的一半,则解决每个部分的问题需要花费初始时间的四分之一,因此在两个部分中解决问题需要的时间大约是蛮力解决方案所需时间的一半。将其分为四个部分需要四分之一的时间,将其分成八个部分需要八分之一的时间,以此类推。
在这种情况下,递归版本最终更快,因为在每个步骤中,通过确保不需要检查太多实际上需要检查的元素对,可以避免处理元素对所需的大量工作。大多数具有分治解决方案的算法出于类似的原因而更快。
对于您的第二个问题,分治算法不一定比暴力算法更快。考虑查找数组中的最大值问题。暴力算法需要O(n)时间,并使用O(1)空间,因为它对数据进行线性扫描。以下是分治算法:
这也需要O(n)时间,但是使用O(log n)内存作为堆栈空间。实际上比简单的线性算法更糟糕。
作为另一个例子,最大单卖利润问题具有分治解决方案,但优化的动态规划解决方案在时间和内存方面都更快。
希望这会有所帮助!