【发布时间】:2019-03-29 14:19:14
【问题描述】:
我读到 numpy uses pairwise summation 作为其计算总和的默认算法(也由 numpy github 存储库中的 pull request 之一确认)
所以对于如下一般的 sn-p:
data = np.ones((1000,1000))
sum = np.sum(data)
print(sum)
成对求和的运行时间复杂度是多少?由于它遵循类似于divide and conquer 的贪婪方法,因此它必须在log 范围内,但我不确定确切的等式。
【问题讨论】:
-
您链接到的维基百科文章说“成对求和是 NumPy[4] 和 Julia 技术计算语言 [5] 中的默认求和算法,在这两种情况下 具有与天真的求和相当的速度(由于使用了大型基础案例)。”
-
将
n任意数字相加仍然需要 Ω(n) 时间。成对求和只是以可预测的方式管理舍入误差。如果 NumPy 的实现是高效的,那么复杂度将是 Θ(n)。 -
获得次线性复杂度的唯一方法是利用您正在求和的数据的一些特殊属性。 (例如,您可以使用公式
sum(1..n) = n(n+1)/2在 O(1) 时间内将数字 1 添加到n。) -
分而治之本身不提供任何加速;这只是组织子问题的一种方式。由于分而治之,快速排序并不快;它很快,因为每个子数组都可以就地排序。二进制搜索速度很快,因为实际上只处理了 一个 子问题。
标签: python algorithm numpy data-structures big-o