计算算法的复杂性

时间:2011-06-29 06:23:02

标签: algorithm complexity-theory

我不确定这是否是一个有效的问题。

假设有一个O(n ^ 3)算法,每天用计算能力x对100个数字进行排序。

如果计算能力加倍,即可以排序多少个数字,即2倍。

我明白我不会定义'计算能力'。如果不明确或错误,请更正问题。

2 个答案:

答案 0 :(得分:7)

Big O表示法不会给你时间(真正的计算机时间)。这是一种尝试独立于cpu或其他特定计算机功能来理解算法效率的方法。

在mathamatics中,你可以说O(n ^ 2)比O(n ^ 3)更有效。但是在工程师观点中,对于n的某些值,O(n ^ 3)可以优于O(n ^ 2)。这种方法只是说,对于足够大的n,O(n ^ 2)将比O(n ^ 3)更有效。

对你的算法分析有很好的介绍。第一章有助于解释这些事情: MIT 6.046J / 18.410J Introduction to Algorithms

Big O表示法只能说对于同一台机器,对于足够大的n,O(n ^ 2)优于O(n ^ 3)。但对于相同的算法,我认为你不能在计算机功率和输出之间做出直接的比较。 如果我们加倍计算机功率,输出会翻倍?也许是,但可能不是。 我认为只要查看算法Big O就不能​​说出这样的话。

enter image description here

答案 1 :(得分:5)

N = 100可能不够大,无法假设算法已经达到了CPU使用率的渐近行为,因此使用大O表达式来推断更大数据集的CPU使用率可能会产生错误的结果。

尽管如此,您可以尝试确定您是否已经处于渐近区域,测量其他大小的数据集(例如,50,80,120等)的CPU使用情况,并了解它们如何适合{{ 1}}曲线,C是一个待确定的常数。

如果在给定N之后拟合“足够好”,则可以使用相同的曲线来预测更大数据集的CPU使用率。

在任何情况下,您都应该将这些预测视为计算某些数据集所需的CPU时间的下限,因为在实践中,其他计算资源(如内存,缓存或IO)可能会成为CPU使用率的瓶颈。

更新:回应Vapuru帖子及其评论:

对于典型的O(N ^ 3)算法,特定实现执行的操作数为t = C*N^3(可能还有其他组件,如t = a + b * N + c * N^2 + d * N^3,但正如您将看到的,它不会实际上很重要。因此,对于大小为log NN1的两个给定数据集,您可以分别计算N2t1

对于给定的OP问题,t2t2 / t1 = 2以及(a + b * N2 + c * N2^2 + d * N2^3) / (a + b * N1 + c * N1^2 + d * N1^3) = 2N1足够大,表达式可以近似为N2进一步简化为(d * N2^3)/(d * N1^3) = 2,因此(N2/N1)^3 = 2

这意味着对于大数据集,处理时间加倍(或处理速度加倍并保持时间不变),允许将数据集的大小增加大约N2 = N1 * 2^(1/3),即2^(1/3)或者是26%。

实际上,除了CPU速度之外的其他因素可能会影响性能,因此实际上它应该被理解为1.26