该算法取自Alexander Shen的伟大的“算法与编程:问题与解决方案”(即练习1.1.28)。
以下是我对俄语的翻译,请原谅我的错误或含糊不清。如果你愿意,请纠正我。
使用给定的自然 n 算法计算解的数量 不等式
x*x + y*y < n
在自然(非负)数字中不使用 对实数的操纵
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 成比例,因为可以计算”。所以我问你如何用严格的数学计算。
答案 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
因此k
从0
升级到SQRT(n)
并且内部循环具有以下条件:k*k + l*l < n
因此l
从0
升级到SQRT(n-k^2)
。但这比SQRT(n)
因此,最大迭代次数小于SQRT(n) * SQRT(n)
n
,并且在每次迭代中都会执行一定数量的操作。
答案 2 :(得分:1)
算法所用的时间与所做的操作次数成正比。因此,您只需计算算法所花费的时间与输入的大小(n)成正比。您可以通过使用各种n计算算法的完成时间并绘制n vs time
图来实现此目的。这样做会给你一个线性图。