我知道每种语言都有最长的执行时间(C ++为2秒)。鉴于此,我怎样才能判断我的算法是否不应该是O(n)或O(n ^ 2)等。
答案 0 :(得分:0)
您可以根据您要操作的数据集来判断。
让我们说
N
是您算法运算的最大元素数TL
是您的总时间限制,对于C ++而言是2秒L
是处理单个元素的时间限制。在这种情况下,L
计算为TL
除以N
的时间复杂度。
例如。对于TL=2
和N=10^2
:
O(n)
算法L=2/10^2=2*10^-2
,这意味着您可以为每个元素花费不超过0.02秒(20毫秒)。O(n*logn)
算法L=2/(10^2*log10^2)=2/(10^2*6)=3*10^-3
,这意味着您可以为每个元素花费不超过0,003秒(3毫秒)O(n^2)
算法L=2/(10^2^2)=2*10^-4
,这意味着您可以花费不超过0,0002秒(0.2毫秒,即200微秒)。 N
越大 - 你的处理时间越少。
现在,当您估算出单个元素的边界时,您可以估计出您可以做多少。简单的算术,函数调用需要纳秒,内存访问可能需要10纳秒(cpu time cost estimation taken from here)。
因此,作为一个经验法则 - 如果你已经完成了算法和数据集的计算,并且你得到的结果不到2 * 10 ^ -7 - 你很可能会赢得比赛。在2秒内完成。
请注意,对于这个计算,你不应该忽略常数因素(即,最好采取像O(n * logn + n)或O那样的接近时间复杂度( 3 * n))因为它们会影响估计。