ループがログ時間を実行するときの複雑さ

If we're finding the no. of factors of a number, we can use the following efficient loop. for(i=1;i<=sqrt(n);i++), where n is the 'no' whose factors are to be found. This loop would have a complexity of O(n).

以下のコードスニペットの時間的な複雑さは何でしょうか。 (log(x)が2を底とするlog値を返すと仮定します)。 O(n ^ 2)またはO(n logn) (log nはループが2で割るときの複雑さであると思います。すなわち、i/= 2)

void fun()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=log(i);j++)
            printf("hello world");
}
0
はい、宿題は楽しいです:-)
追加された 著者 Thorsten Dittmar,
Stack Overflowでは、助けを求める前に、人々が自分たちの仕事にいくらかの努力を払うことを期待します。そして彼らが問題を解決しようとしたことを説明するために。
追加された 著者 Dialecticus,
Stack Overflowでは、助けを求める前に、人々が自分たちの仕事にいくらかの努力を払うことを期待します。そして彼らが問題を解決しようとしたことを説明するために。
追加された 著者 Dialecticus,
Stack Overflowでは、助けを求める前に、人々が自分たちの仕事にいくらかの努力を払うことを期待します。そして彼らが問題を解決しようとしたことを説明するために。
追加された 著者 Dialecticus,

6 答え

あなたのコードに印刷された「Hello world」の実際の数は、次のとおりです。

ログの Srinivasa Ramanujan近似を使用できます(n!)。

コード全体の実際の複雑さ、つまりO(n logn)を取得する

1
追加された
はい、 for(i = 1; i <= n; i * = 2)または for(i = n; i> = 1; i/= 2)<�のようなforループ/ code>はO(logn)で動きますが、あなたの質問にはそのようなループはありません。ここでlogn項は2番目のループの j <= log(i)条件から来ています。
追加された 著者 BlackDwarf,
さて、私はあなたが意味するものを手に入れていないのではなく、「数の因数を見つける」問題とあなたが提供したコードスニペットの間のリンクも手に入れません(i = 1; i <= sqrt(n); i ++)複雑さはO(n)が真実で、実際にはO(sqrt(n))で実行されます。
追加された 著者 BlackDwarf,
log nは、ループが2で割られるときの複雑さであると思います。すなわち。 i/= 2
追加された 著者 TheHardRock,
しかし、最初の3行に書いたように、ループがsqrt(n)回実行された後でも、そのプログラムの複雑さはO(n)になるでしょう。それでは、前の場合と同様に、log n項はO(n)の代わりにj <= log(i)の後にくるのでしょうか。
追加された 著者 TheHardRock,

あなたのコードに印刷された「Hello world」の実際の数は、次のとおりです。

ログの Srinivasa Ramanujan近似を使用できます(n!)。

コード全体の実際の複雑さ、つまりO(n logn)を取得する

1
追加された
はい、 for(i = 1; i <= n; i * = 2)または for(i = n; i> = 1; i/= 2)<�のようなforループ/ code>はO(logn)で動きますが、あなたの質問にはそのようなループはありません。ここでlogn項は2番目のループの j <= log(i)条件から来ています。
追加された 著者 BlackDwarf,
さて、私はあなたが意味するものを手に入れていないのではなく、「数の因数を見つける」問題とあなたが提供したコードスニペットの間のリンクも手に入れません(i = 1; i <= sqrt(n); i ++)複雑さはO(n)が真実で、実際にはO(sqrt(n))で実行されます。
追加された 著者 BlackDwarf,
log nは、ループが2で割られるときの複雑さであると思います。すなわち。 i/= 2
追加された 著者 TheHardRock,
しかし、最初の3行に書いたように、ループがsqrt(n)回実行された後でも、そのプログラムの複雑さはO(n)になるでしょう。それでは、前の場合と同様に、log n項はO(n)の代わりにj <= log(i)の後にくるのでしょうか。
追加された 著者 TheHardRock,

あなたのコードに印刷された「Hello world」の実際の数は、次のとおりです。

ログの Srinivasa Ramanujan近似を使用できます(n!)。

コード全体の実際の複雑さ、つまりO(n logn)を取得する

1
追加された
はい、 for(i = 1; i <= n; i * = 2)または for(i = n; i> = 1; i/= 2)<�のようなforループ/ code>はO(logn)で動きますが、あなたの質問にはそのようなループはありません。ここでlogn項は2番目のループの j <= log(i)条件から来ています。
追加された 著者 BlackDwarf,
さて、私はあなたが意味するものを手に入れていないのではなく、「数の因数を見つける」問題とあなたが提供したコードスニペットの間のリンクも手に入れません(i = 1; i <= sqrt(n); i ++)複雑さはO(n)が真実で、実際にはO(sqrt(n))で実行されます。
追加された 著者 BlackDwarf,
log nは、ループが2で割られるときの複雑さであると思います。すなわち。 i/= 2
追加された 著者 TheHardRock,
しかし、最初の3行に書いたように、ループがsqrt(n)回実行された後でも、そのプログラムの複雑さはO(n)になるでしょう。それでは、前の場合と同様に、log n項はO(n)の代わりにj <= log(i)の後にくるのでしょうか。
追加された 著者 TheHardRock,

内側のループは [1..n] の範囲の i に対して printflog(i)回呼び出します。 。呼び出しの総数はおよそです

log(1)+log(2)+log(3)+...log(n) = log(n!)

さて、スターリング漸近式はあなたに解決策を与えるでしょう。


2を底とする対数の場合、正確な数は次の式で与えられます。

0 + 1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + ... + floor(Lg(n))

または

1.0 + 2.1 + 4.2 + 8.3 + ... + k.floor(Lg(n))

Fまたはconvenience, assume that n is of the form n=2^m-1, so that the last run is complete (and k=2^(m-1)).

Now take the sum of x^k from 0 to m-1, which equals (x^m-1)/(x-1) and derive on x to get the sum of x^k.k. Evaluating fまたはx=2, you get

s = m.2^m-2^m+2 = (n+1).Lg(n+1)-n+1

Fまたはother n, you need to add a correction term fまたはthe last partial run. With m=floor(Lg(n+1)):

t = m.(n+1-2.2^m)
0
追加された

内側のループは [1..n] の範囲の i に対して printflog(i)回呼び出します。 。呼び出しの総数はおよそです

log(1)+log(2)+log(3)+...log(n) = log(n!)

さて、スターリング漸近式はあなたに解決策を与えるでしょう。


2を底とする対数の場合、正確な数は次の式で与えられます。

0 + 1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + ... + floor(Lg(n))

または

1.0 + 2.1 + 4.2 + 8.3 + ... + k.floor(Lg(n))

Fまたはconvenience, assume that n is of the form n=2^m-1, so that the last run is complete (and k=2^(m-1)).

Now take the sum of x^k from 0 to m-1, which equals (x^m-1)/(x-1) and derive on x to get the sum of x^k.k. Evaluating fまたはx=2, you get

s = m.2^m-2^m+2 = (n+1).Lg(n+1)-n+1

Fまたはother n, you need to add a correction term fまたはthe last partial run. With m=floor(Lg(n+1)):

t = m.(n+1-2.2^m)
0
追加された

内側のループは [1..n] の範囲の i に対して printflog(i)回呼び出します。 。呼び出しの総数はおよそです

log(1)+log(2)+log(3)+...log(n) = log(n!)

さて、スターリング漸近式はあなたに解決策を与えるでしょう。


2を底とする対数の場合、正確な数は次の式で与えられます。

0 + 1 + 1 + 2 + 2 + 2 + 2 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + ... + floor(Lg(n))

または

1.0 + 2.1 + 4.2 + 8.3 + ... + k.floor(Lg(n))

Fまたはconvenience, assume that n is of the form n=2^m-1, so that the last run is complete (and k=2^(m-1)).

Now take the sum of x^k from 0 to m-1, which equals (x^m-1)/(x-1) and derive on x to get the sum of x^k.k. Evaluating fまたはx=2, you get

s = m.2^m-2^m+2 = (n+1).Lg(n+1)-n+1

Fまたはother n, you need to add a correction term fまたはthe last partial run. With m=floor(Lg(n+1)):

t = m.(n+1-2.2^m)
0
追加された