我有2个算法可以做某事(例如搜索列表),一个具有线性复杂度,另一个具有日志复杂度(O(log n)。如果我在比较100和1000个单位的操作,我会说线性算法吗?有缩放因子x10?
如何表达日志算法缩放系数?例如100件需要2秒,1000件需要3秒。 1000的日志是3,100的日志是2.那么比例因子是什么? X1.5?
我可以看到时间的增长是对数的。或者你只是说比例因子是对数?但是如果例子比较100到1000项,你会计算什么?
答案 0 :(得分:2)
我会把它称为“它以线性/二次/立方/对数/指数方式缩放”,我根本不会参考精确的缩放因子。大O不是特定时间,它是将算法放入某些类的方法,即。线性类,对数类等。
关键不在于对确切的运行时进行假设(这受到许多细节的影响,完全取决于运行算法的机器),而是能够以相对的方式进行,所以你可以这么说O(n²)算法将比O(n),O(log n)慢一点。
答案 1 :(得分:2)
您的问题预先假定“缩放因子”对于除线性之外的任何复杂性顺序都是有意义的,而事实并非如此。但即使对于线性,它也是毫无意义的。请注意,仅仅因为算法O(n)
并不意味着大小为2x
的输入将比大小为x
的输入长两倍“长”。
你的问题也预先假定了一种常见的误解,即复杂性的顺序可以转化为时间。它不是。复杂度顺序对于算法的渐近分析很有用,而不是用于测量完成时间给出特定的输入大小。
答案 2 :(得分:1)
通常,您无法仅从Big O复杂度计算数字缩放因子,因为Big O复杂性省略了对计算缩放因子至关重要的系数和常量。
如果算法A的实际复杂度为(1/1000) * n + 100
,而算法B的实际复杂度为100*log(n) + 1
,则算法A为O(n),而算法B为O(log(n))。但是,当你从100的n变为1000的n时,A的成本从100.1变为101,而B的成本从201变为301.算法A的实际运行时间仅增加1%而算法B的实际运行时间增加了50%。
Big O符号旨在告诉您某些东西如何随着n变为无穷大。当您查看实际的非无限范围时,具有更好的Big O表示法的算法完全有可能比具有更差Big O表示法的算法更慢并且缩放效率更低。对于足够大的n,具有更好的Big O表示法的算法最终将获胜。但是无法保证交叉点实际上在任何特定目的的预期范围内。