【问题标题】:Difference between graphs and asymptotic analysis to compare running times of an algorithm图和渐近分析之间的差异以比较算法的运行时间
【发布时间】:2015-10-23 16:26:03
【问题描述】:
这个问题几乎说明了我的要求。
我有一个算法,但我正在徘徊什么是实现啊'Big-Oh'运行时间的更好方法 - 通过图表并将输入数量与运行时间绘制出来,还是通过渐近分析?
对于我目前使用的图表:
private int startTime = System.currentTimeMillis(); //At start of algorithm
private int endTime = System.currentTimeMillis(); //At the end of algorithm
int runningTime = endTime - startTime;
两种“测量”算法运行时间的方法有什么区别?
【问题讨论】:
标签:
java
algorithm
performance
big-o
time-complexity
【解决方案1】:
“经验”(根据输入大小绘制运行时间)的问题是它仅适用于提供的测试用例。
“理论”分析为您提供算法的所有陷阱,您可以使用数学分析真正的最佳情况/平均情况/...,并且保证是正确的。
一个很好的常见示例是simplex algorithm,它通常非常快,但对于某些输入,偶尔会出现指数最坏情况的运行时间。
另一方面,由于渐近分析忽略常数,并且只适用于“足够大的输入”,如果预计输入相对较小,它们几乎没有用,并且很难区分两种算法相同的复杂度类,但具有不同的常量,并且常量在生产代码中确实很重要。
tl;dr:每种都有自己的用法,将两者结合使用比仅使用其中一种效果更好。
附带说明,在使用经验方法时,请务必使用统计工具,并在得出结论之前专门statistical hypothesis testing。另外,请始终记住,经验工具仅对您检查的问题类别有效(因此,例如,如果您不检查排序数组,您将不知道快速排序遇到问题时可能需要更长的时间)。