为啥分而治之在数组总和上没有表现出其性能优势?

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 读者可以使用它。

以上是关于为啥分而治之在数组总和上没有表现出其性能优势?的主要内容,如果未能解决你的问题,请参考以下文章

在 O(nlogn) 时间复杂度中找到总和为 0 的子数组(使用分而治之)?

分而治之是不是利用了最优子结构?

使用C使用分而治之查找数组中的多数元素

为啥分而治之的算法通常比蛮力运行得更快?

计算优势点的分而治之算法?

分而治之——未排序数组的k个元素