为啥分而治之在数组总和上没有表现出其性能优势?
Posted
技术标签:
【中文标题】为啥分而治之在数组总和上没有表现出其性能优势?【英文标题】:Why Divide-And-Conquer does not show its performance advantage on sum of array?为什么分而治之在数组总和上没有表现出其性能优势? 【发布时间】:2018-07-19 21:13:21 【问题描述】:在计算数组和时,将值逐一相加的成本与分治递归计算相同。为什么这一次分而治之没有显示出比一一相加的性能优势?
为什么分而治之在排序上比一一比较好得多?
这两种情况的核心区别是什么?
【问题讨论】:
如何计算分治法数组的总和? O(n) 是解决这个问题的最佳选择,因为您必须至少查看每个数字一次。 核心区别在于简单的排序算法是O(n^2)。每个元素都会检查n
次。因此,挑战在于将检查元素的次数减少到少于n
。使用数组的总和,每个元素被检查一次。没有办法将 once 减少到小于 once 的任何值。
恕我直言,分而治之只有在并行执行时才可以支付(这会带来开销)。您的实现是否使用并行化?
【参考方案1】:
首先,在计算数组之和时,如果使用分治法,运行时递归会如下所示。
T(n) = 2 * T(n/2) + 1
通过Master Theorem,这会产生O(n)
的运行时界限。此外,虽然与顺序加法具有相同的运行时界限,但此界限是最佳的;输出取决于输入中的每个数字,无法在小于O(n)
的运行时范围内读取。
话虽如此,分治法本身并不比任何其他方法产生更好的运行时限制;它只是一种设计范式,描述了解决问题的某种方法。
此外,顺序加法也可以解释为分而治之,尤其是在递归实现的情况下;运行时绑定是
T(n) = T(n-1) + 1
这也是O(n)
。
【讨论】:
同意,尽管 DnC 通常更适合并行化/多线程 不错的答案!它是中肯的,相当简短和完整。赞成。你会考虑用更简单的词汇来重写它吗?我希望看到更广泛的 SO 读者可以使用它。以上是关于为啥分而治之在数组总和上没有表现出其性能优势?的主要内容,如果未能解决你的问题,请参考以下文章