好消息首先,您的计算结果没有“错误”。
当然,如果算法的复杂度更高(例如 O(n^2) 复杂度高于 O(log n)),那么您仍然能够在“可接受”时间内处理的问题规模会更小,完全按照你的计算。
尽管这个例子似乎有点扭曲,我不得不承认,我没有完全理解目的,你发明了 10^-7 因子,因此怀疑你没有正确理解 O 符号的概念.
本质上,O 表示法的主要思想是,在比较两种算法时,您不关心任何线性因子(例如您在计算中发明的 10^7 因子),而只关心计算时间的增长速度问题的规模,因为与问题规模导致的计算时间增长相比,常数(因此不会增长)因素迟早会变得无关紧要。
举个例子:
使用 O(n^2) 算法 A,耗时 t=2*n^2 毫秒,使用 O(log n) 算法 B,在特定机器上耗时 t=200*log(n) 毫秒给定问题大小 nr 的情况如下所示:
对于一个非常小的问题,比如 n=10,算法 A 可能比算法 B 更快:
2*10^2 = 2*100 = 200 毫秒
400*log10 = 400*1 = 400 毫秒
但是随着问题规模的扩大,比如 n=100,算法 B 迟早会在速度上超过算法 A:
2*100^2 = 2*10,000 = 20,000 毫秒
400*log100 = 400*2 = 800 毫秒
对于更大的问题,比如 n=1,000,000,等待 A 完成可能需要很大的耐心。
2*1,000,000^2 = 2*10^12 毫秒 = 2*10^9 秒 = 33333333 分钟 = 555555 小时 = 23148 天 = 63 年
算法 B 可能仍会在可接受的时间内运行。
400*log1,000,000 = 400*6 = 2,400 毫秒 = 2.4 秒
随着问题规模的增长,常数因子扮演的角色越来越小,对于越来越大的问题,它变得越来越无关紧要,因此(连同遵循相同规则的低阶项)在 O符号。
因此,查看 O 表示法中给出的复杂性的“正确”方法不是尝试查看固定 n 的固定值,甚至不重新发明常数因子和已经抽象出的低阶附加项,而是查看计算时间有多快随着问题的大小而增长。
因此,再次以示例为例,查看 O(n^2) 和 O(log10) 复杂性的“正确”方法是比较它们的增长。
如果问题大小增加 10 倍,算法 A 的计算时间将增加 100 倍,因此需要的时间是以前的 100 倍,如下所示:
(n*10)^2 = n^2 * 10^2 = n^2 * 100
虽然算法 B 的计算时间只会增长一个常数,如下:
对数(n*10)=对数(n)+对数(10)=对数(n)+1