如何通过查看Hackerrank.com等网站上的问题中给出的约束来计算算法的运行时间?

时间:2017-02-28 03:50:05

标签: performance

我知道每种语言都有最长的执行时间(C ++为2秒)。鉴于此,我怎样才能判断我的算法是否不应该是O(n)或O(n ^ 2)等。

1 个答案:

答案 0 :(得分:0)

您可以根据您要操作的数据集来判断。

让我们说

  • N是您算法运算的最大元素数
  • TL是您的总时间限制,对于C ++而言是2秒
  • L是处理单个元素的时间限制。

在这种情况下,L计算为TL除以N的时间复杂度。 例如。对于TL=2N=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))因为它们会影响估计。