需要帮助计算此算法的操作复杂性

时间:2012-08-09 12:28:29

标签: algorithm complexity-theory pascal time-complexity

该算法取自Alexander Shen的伟大的“算法与编程:问题与解决方案”(即练习1.1.28)。

以下是我对俄语的翻译,请原谅我的错误或含糊不清。如果你愿意,请纠正我。

算法应该做什么

  

使用给定的自然 n 算法计算解的数量   不等式

x*x + y*y < n 
     

在自然(非负)数字中不使用   对实数的操纵

在Pascal中

k := 0; s := 0;

{at this moment of execution
 (s) = number of solutions of inequality with
 x*x + y*y < n, x < k}
while k*k < n do begin
  l := 0; t := 0;

  while k*k + l*l < n do begin
    l := l + 1;
    t := t + 1;
  end;

  {at this line 
   (t) = number of solutions of k*k + y*y < n
   for given (k) with y>=0}
  k := k + 1;
  s := s + t;
end;

{k*k >= n, so s = number of solutions of inequality}

此外,在文中,Shen简要地说,该算法执行的操作数量“与 n 成比例,因为可以计算”。所以我问你如何用严格的数学计算

3 个答案:

答案 0 :(得分:2)

嵌套循环完成的操作次数是2个长度的乘法

例如:

for i=1 to 5
 for j = 1 to 10
  print j+i
 end
end

将打印5 * 10 = 50次

在您的示例中,外部循环运行sqrt(n)次 - 直到k ^ 2 = n或k = sqrt(n)。 内循环也运行sqrt(n)次。 k在循环内是恒定的,并且当k ^ 2 + 1 ^ 2> n时它将停止,它可以运行的最多次是在k = 0 - > l ^ 2&gt; n =&gt; l&gt; sqrt(n)。 所以迭代总数最多为sqrt(n)* sqrt(n) - O(n)

答案 1 :(得分:2)

你有两个循环,一个在另一个内。

外部具有以下条件:k*k < n因此k0升级到SQRT(n)

并且内部循环具有以下条件:k*k + l*l < n因此l0升级到SQRT(n-k^2)。但这比SQRT(n)

更加狡猾

因此,最大迭代次数小于SQRT(n) * SQRT(n) n,并且在每次迭代中都会执行一定数量的操作。

答案 2 :(得分:1)

算法所用的时间与所做的操作次数成正比。因此,您只需计算算法所花费的时间与输入的大小(n)成正比。您可以通过使用各种n计算算法的完成时间并绘制n vs time图来实现此目的。这样做会给你一个线性图。

相关问题