我有一个问题,试图决定我实施的Rabin-Miller算法的大O符号。
生成
时 512 bits prime, I get a runtime of 22 seconds,
1024 takes 237 seconds,
2048 takes 2942 seconds.
如何确定这些值的大O表示法?在我看来,每当bitsize增加2时,运行时间增加大约 10次。这是否意味着它是O(10n)
?
答案 0 :(得分:1)
你有太少的点来估算实验中的函数(以及O(function)
)。
x | f(x)
-----------
512 | 22
1024 | 237
2048 | 2942
如果我们在Least Squares方法的帮助下测试O(n)
(O(10n)
实际上是O(n)
)为f(x) = Ax + B
猜测,我们会得到一个好消息适合
A = 2.0
B = -1330.5
R = 0.964 (Correlation)
但是,许多替代功能都有更好的支持
f(x) = Ax**4 + B with correlation R = 0.99990 <- actual best fit
f(x) = Ax**3 + B -/- R = 0.99937 <- expected
f(x) = Ax**2 + B -/- R = 0.99232
您希望更多积分找出正确的功能:当三个值只有Ax**4 + B
(对应于O(x**4)
)时, 领导者到目前为止,但我们无法拒绝Ax**3 + B
O(x**4)
。
最后,我们可以猜测(我们不能只用三点结束)实现次优:{{1}而不是预期的O(x**3)
如果我们的猜测O(x**4)
是正确的,那么我们可能会认为加倍x
:x -> 2 * x
我们会增加时间16-fold
(2**4 == 16
)