我不确定这是否是一个有效的问题。
假设有一个O(n ^ 3)算法,每天用计算能力x对100个数字进行排序。
如果计算能力加倍,即可以排序多少个数字,即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就不能说出这样的话。
答案 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 N
和N1
的两个给定数据集,您可以分别计算N2
和t1
。
对于给定的OP问题,t2
,t2 / t1 = 2
以及(a + b * N2 + c * N2^2 + d * N2^3) / (a + b * N1 + c * N1^2 + d * N1^3) = 2
和N1
足够大,表达式可以近似为N2
进一步简化为(d * N2^3)/(d * N1^3) = 2
,因此(N2/N1)^3 = 2
。
这意味着对于大数据集,处理时间加倍(或处理速度加倍并保持时间不变),允许将数据集的大小增加大约N2 = N1 * 2^(1/3)
,即2^(1/3)
或者是26%。
实际上,除了CPU速度之外的其他因素可能会影响性能,因此实际上它应该被理解为1.26
。