【发布时间】:2013-07-30 15:50:02
【问题描述】:
我刚刚完成了一些经典的分而治之算法的编码,我提出了以下问题:(更多好奇)
诚然,在很多情况下,分治算法比传统算法更快;例如,在快速傅里叶变换中,它将复杂度从 N^2 提高到 Nlog2N。但是通过编码,我发现,因为“划分”,我们的子问题更多,这意味着我们必须在子问题上创建更多的容器并额外分配更多的内存。想想看,在归并排序中,我们必须在每次递归中创建左右数组,而在快速傅里叶变换中,我们必须在每次递归中创建奇数和偶数数组。这意味着,我们必须在算法期间分配更多内存。
所以,我的问题是,在现实中,例如在 C++ 中,当我们还必须增加内存分配的复杂性时,分而治之的算法真的会赢吗? (或者内存分配根本不需要运行时间,成本为零?)
感谢您帮助我!
【问题讨论】:
-
在许多情况下,减少函数运行所需的时间需要相应地增加内存使用量。例如,您可以通过在内存中存储许多素数来减少素数查找算法所花费的时间。
-
在编程中,您经常需要在快速或精简资源之间进行选择,您很少能同时选择两者。 (不幸的是,很容易找到没有选择任何替代方案的程序。)
-
并不是所有的分治法都需要更多的内存,在很多情况下操作可以就地完成。诚然,在某些情况下需要或需要额外的内存(您可以在合并排序中执行合并步骤而无需获取额外的内存,但性能会更差。
-
内存分配确实需要一些时间,但是您必须根据具体情况来看待这一点。
-
复杂性理论中有一些结果可以对某些问题进行权衡。例如,一个重要的结果表明,不能同时在线性时间和对数空间中确定布尔公式的可满足性。您至少需要其中一个,这样做可以减少其他资源的使用。
标签: c++ algorithm memory-management divide-and-conquer