web-dev-qa-db-ja.com

複雑さO(log(n))はO(sqrt(n))と同等ですか?

私の教授は、入力の長さを半分にする操作にはO(log(n))の複雑さが経験則だと教えてくれました。なぜO(sqrt(n))ではないのですか、両方とも同等ではありませんか?

27
white_tree

それらは同等ではありません:sqrt(N)log2(N)。定数はありませんCなので、Nのすべての値に対してsqrt(N)<C.log(N)になります。 =ある最小値より大きい。

これを取得する簡単な方法は、log2(N)Nの(2進)桁数に近い値になりますが、sqrt(N)はそれ自身の数になりますNの桁数の半分。または、平等でそれを述べるには:

- ログ2(N 2log2(sqrt(N)))==

したがって、sqrt(N)の対数(!)を取得して、log2(N)

たとえば、11桁の2進数の場合、0b10000000000(= 210)、平方根は0b100000ですが、対数は10のみです。

42
trincot

natural logarithm(そうでなければ定数を掛けるだけ)と仮定すると、

lim {n->inf} log n / sqrt(n) = (inf / inf)

                        =  lim {n->inf} 1/n / 1/(2*sqrt(n)) (by L'Hospital)
                        =  lim {n->inf} 2*sqrt(n)/n
                        =  lim {n->inf} 2/sqrt(n)
                        =  0 < inf

O(.)の代替定義については https://en.wikipedia.org/wiki/Big_O_notation を参照してください。これにより、上記からlog n = O(sqrt(n))と言うことができます。

また、以下の関数の成長を比較してください。log nは、_nが大きい場合、常にsqrt(n)によって上限が設定されます。

enter image description here

10
Sandipan Dey

いいえ、同等ではありません。

@trincotは、彼の答えに例を使って1つの優れた説明をしました。もう1つポイントを追加します。あなたの教授が教えてくれました

any operation that halves the length of the input has an O(log(n)) complexity

それも真実です

any operation that reduces the length of the input by 2/3rd, has a O(log3(n)) complexity
any operation that reduces the length of the input by 3/4th, has a O(log4(n)) complexity
any operation that reduces the length of the input by 4/5th, has a O(log5(n)) complexity
So on ...

(B-1)/Bth.による入力の長さのすべての短縮にも当てはまります。その場合、O(logB(n))の複雑さを持ちます。

N:B:O(logB(n))Bベースのnの対数を意味します

3
jbsu32

いいえ、それらはnotと同等です。あなたもそれを証明することができます

   O(n**k) > O(log(n, base)) 

k > 0およびbase > 1sqrtの場合はk = 1/2)に対して。

O(f(n))で話すとき、largenlimitsの動作を調査したいはそのための良い手段です。両方の大きなOが同等であるとします:

  O(n**k) = O(log(n, base)) 

つまり、いくつかの有限定数Cがあり、

  O(n**k) <= C * O(log(n, base)) 

十分な大きさのn;言い換えると(log(n, base)0ではなくnから始まり、両方の関数は継続的に微分可能です):

  lim(n**k/log(n, base)) = C 
  n->+inf

制限の値を見つけるには、 L'Hospital's Rule を使用します。つまり、分子と分母の微分を取り、それらを除算します。

  lim(n**k/log(n)) = 

  lim([k*n**(k-1)]/[ln(base)/n]) =

  ln(base) * k * lim(n**k) = +infinity

そのため、O(n**k) < C*log(n, base)などの定数Cは存在しないと結論付けることができます。

 O(n**k) > O(log(n, base)) 
2
Dmitry Bychenko

いいえ、そうではありません。時間の複雑さを扱うとき、入力を非常に大きな数と考えます。それで、n = 2 ^ 18を取りましょう。 sqrt(n)の操作数は2 ^ 9になり、log(n)の場合は18になります(ここでは2を底とするログを考えます)。明らかに2 ^ 9は18よりはるかに大きいので、O(log n)はO(sqrt n)よりも小さいと言えます。

1
androidGeek