繁体   English   中英

查找给定n个产品数量的程序的复杂性

[英]Complexity of the program that finds number of products for given n

我有用于查找给定数量n的产品数量的代码。 我认为复杂度是sqrt(n ^ 3),但其中一些人认为它是n ^ 2。 这是代码:

int f(int n)
{
    int i,j,k,p,r=0;
    k=sqrt(n);
    p=n/2;
    for (i=2; i<=p; i++)
        for(j=2; j<=k; j++)
            if(i*j==n)
                r++;
    return r;           
}

接下来是我的逻辑推理:

T = C1 +(n / 2-1)C2 +(n / 2-1)(sqrt(n)-1)C3

但我不确定

假定内部循环是说j<=k而不是i<=k

您的逻辑和答案都是正确的(从大呵呵的意义上来说)。

另一种看待这种情况的方式是,外循环为O(n/2) (与O(n)相同),内循环为O(sqrt(n)) 将两者相乘得到O(n*sqrt(n)) ,在代数上等同于O(sqrt(n^3))

让我们重构一下代码。 首先,一些密度:

int f(int n)
{
    int r=0;
    int counter = 0;
    for (int i=2; i<= n/2; i++)
        for(int j=2; j<=sqrt(n); j++) {
            if(i*j==n) r++;
            ++counter;
        }
    return r;           
}

我已经介绍了一个计数器,现在我们将其移出循环:

int f(int n)
{
    int r=0;
    int counter = 0;
    for (int i=2; i<= n/2; i++)
        counter += (sqrt(n) - 1);
        for(int j=2; j<=sqrt(n); j++) {
            if(i*j==n) r++;
        }
    return r;           
}

更进一步:

int f(int n)
{
    int r=0;
    int counter = 0;
    counter += (n/2 - 1) * (sqrt(n) -1);
    for (int i=2; i<= n/2; i++)
        for(int j=2; j<=sqrt(n); j++) {
            if(i*j==n) r++;
        }
    return r;           
}

结论:您的推理是正确的。 他们可能没有意识到,您只需要考虑不超过sqrt(n)因素,这将使您变得更加复杂。

该代码的复杂度为O(Nsqrt(N)),因为您的第一个循环具有N/2步骤,而第二个循环具有sqrt(N)步骤,将它们相乘,您将得到N/2*sqrt(N) ,因此是O(NsqrtN)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM