找到除数的数量 - 时间复杂度

时间:2015-01-02 18:13:51

标签: performance algorithm delphi

在学校,我们制作了一个程序,查找给定范围内所有数字的除数,例如,所有5位数字。我们用一个像

这样粗略的算法来做到这一点
for i:=1 to n do begin
    for j:=1 to i do begin
        if (i mod j=0) then Inc(counter);
    end;
    *writing the counter somewhere*
end;

需要n(n+1)/2次迭代(如果我没有弄错的话) - 那是O(n^2)吗?当在6位数的范围内使用时,看到这种情况持续了7分钟到没有结束,我试图改进它。我改变它,以便第二个循环只到i数字的平方根,如下所示:

for i:=1 to n do begin
    for j:=1 to Trunc(sqrt(n)) do begin
        if (i mod j=0) then begin
            Inc(counter);
            if (i/j)>0 then Inc(counter);
        end;
    end;
    *writing the counter somewhere*
end;

我无法找到Delphi的floor函数,因此Trunc - 它与自然数相同。现在,该算法需要floor(sqrt(1))+floor(sqrt(2))+...+floor(sqrt(n))次迭代(我不知道如何在此处插入sigma sum表示法)。有没有办法在没有求和的情况下写出这个,或者更确切地说,用O()符号?

此外,还有更好的算法吗?我不是要求完整的代码,而是要搜索的内容。

0 个答案:

没有答案