比较两种算法的复杂性

时间:2013-02-22 15:35:57

标签: algorithm complexity-theory

我们有两个算法在Visual C ++ 2010中实现并且运行正常。我们知道其中一个的复杂性是n * log(n),另一个是n ^ 2。但是,我怎样才能真正“衡量”运行每个人所需的时间?问题是它们运行得非常快,就像几微秒一样。我可以用这种精度测量,还是可以计算每个所需的CPU周期?在每个循环中添加延迟是正确的吗?

2 个答案:

答案 0 :(得分:1)

好吧,如果你的输入很小,运行时间的渐近测量意味着蹲下,因为常数可能不可忽略,必须加以考虑。

大O表示法很有用,并且只对大输入大小正确预测“哪种算法更好”(对于每个算法对的某些常量n>N,所有输入大小为N)。


要测量两种算法中的哪一种更好,您应该尝试经验和统计方法。
生成数千(或更多)不同的测试用例(自动),并在测试用例上运行算法。在开始运行基准测试之前,不要忘记预热系统。

找出每个测试用例算法的时间(纳秒),并使用统计测量值对两者进行比较 - 你可以看一下平均时间。

您还应该运行 statistical test - 例如Wilcoxon test,以确定运行时间之间的差异是否具有统计显着性。

重要说明:请注意,对于不同的计算机或不同的输入分配,结果可能会有所不同 - 测试可让您对特定计算机和测试用例分发充满信心。

答案 1 :(得分:0)

典型的“testbed”(继承自C)如下所示:

#define n 20
#define itera 10000000

int main(int argc, char* argv[])
{
    clock_t started;
    clock_t stopped;
    double duration;

    started = clock();

    for (unsigned long i = 0; i < itera; i++)
    {   
      for (unsigned k = 0; k < n; k++)
      {
         ....
      }
    }

    stopped = clock();

    duration = (double)(stopped - started) / CLOCKS_PER_SEC;

}

频繁出现陷阱:

编译器可能会以结果误导的方式优化您的代码。 (例如,如果您分配变量并且稍后不使用该变量,则可能会省略计算和赋值)

执行测试时,您的系统可能正忙于处理其他事情。 经常重复测试。

缓存效果可能会影响速度。 如果磁盘访问时间起作用或涉及大量内存,则尤其如此。

算法的性能通常取决于测试数据。

测试平台的外环可能比实际算法花费更多时间。 测量空循环以考虑此影响。