今夜締め切りのプロジェクトの一部として Big O のアイデアを把握しようとしていますが、これが正しいかどうかはわかりません...
このプロジェクトには、数学演算に対する反復および再帰ソリューションの作成が含まれていました。
ここにいくつかの方法があります。
public int inc(int n)
{
n = n + 1;
return n;
}
public int dec(int n)
{
n = n - 1;
return n;
}
public int add(int lhs, int rhs)
{
int sum = lhs;
while (rhs > 0) {
sum = inc(sum);
rhs = dec(rhs);
} // while
return sum;
}
public int fac(int num)
{
int ans = num;
while(num > 1)
{
ans = mul(ans, dec(num));
}
return ans;
}
public int div(int lhs, int rhs) throws ArithmeticException
{
int quot = 0;
while (lhs > 0)
{
lhs = sub(lhs,rhs);
if(lhs < rhs)
{
quot = 0;
}
else
{
quot = inc(quot);
}
}
return quot;
}
public int lshift(int lhs, int rhs)
{
return mul(lhs,pow(2,rhs));
}
これらはすべて O(n) でしょうか? それとも単に inc,dec, and add?
他のメソッドが呼び出される行 (mul -multiply - in fac および lshift など) の場合、これは定数時間ですか、それとも n であり、O(n^2) になりますか? 誰か説明してくれませんか?
また、再帰的なメソッドをどのように処理すればよいでしょうか?
public int mul(int lhs, int rhs)
{
if (rhs == 0 || lhs == 0) return 0;
else if(rhs == 1) return lhs;
return add(lhs, mul(lhs, dec(rhs)));
}
誰かが他のことを求めない限り、再帰的な例を 1 つ残します。if と else if はそれぞれ一定時間と見なされますよね?次に、return は (明らかに) それ自体だけでなく、あらゆる種類の他の再帰メソッドを呼び出しており、どこから始めればよいかまったくわかりません。
誰かがこれを本当に簡単に説明しようとすることができますか?
編集:パウを追加
public int pow(int lhs, int rhs)
{
int ans = lhs;
for(int i = rhs; i > 1; i--)
{
ans = mul(ans,lhs);
}
return ans;
}