因此,从我的讲解中,我们只能用渐近分析来评估算法,但在执行算法时,它只能返回一定的时间。 我的问题是我们如何比较这两者?
答案 0 :(得分:1)
它们具有可比性但不符合你想要的方式。
如果你有一个实现,你渐渐评估为O(N ^ 2)并且你测量为在60秒内输入N = 1000,那么如果你将输入更改为N = 2000我会期望运行时间大约为60 *(2 ^ 2)4分钟(我将输入增加了两倍,运行时间增加了2平方)。
现在,如果您还有另一个算法O(N ^ 2),您可以观察它在10秒内运行N = 1000(编译器创建更快的指令,或者CPU更好)。现在,当你移动到N = 2000时,我预计运行时间大约为40秒(相同的逻辑)。如果您实际测量它,由于系统负载或优化,您可能仍会看到与预期值的某些差异,但随着N的增长它们变得不那么重要。
因此,您无法单独根据渐近复杂度来确定哪种算法更快。渐近复杂性保证了输入足够大的地方,其中较低的复杂度会更快,但是没有什么可以保证足够大的"足够大的"装置
另一个例子是搜索。您可以执行线性搜索O(N)或二进制搜索O(logN)。如果您的输入很小(<128英尺),则编译器和处理器比二进制搜索更快地进行线性搜索。然而,将N增加到100万项,二元搜索将比线性快得多。
通常,对于大输入,首先优化复杂性,对于小输入,首先优化运行时间。一如既往,如果你关心性能做基准测试。