[英]how to find all factors of a given number N with time complexity less then 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.