配列をに分割した場合の再帰の深さは何ですか


7

配列を入力として受け取る関数があります。配列を同じサイズの部分に分割しますは配列のサイズです。要素が2つだけ残るまで、各サブ配列を分割し続けます。この再帰の深さはどれくらいですか?log2⁡(n)n

プロセスの例:

最初に要素があり、それらを同じサイズの部分に分割します。これらの各部分には、要素が含まれています。次のレベルの再帰では、各配列を同じサイズの部分に再度分割します。これらの各要素には、要素が含まれるようになります。そして、要素が2つしかないサブ配列に到達するまで、この方法で配列を分割し続けます。nlog2⁡(n)nlog2(n)log2(nlog2(n))nlog2(n)log2(nlog2(n))


簡単に計算できますね。たとえば、n = 1,000,000を試してください。それを手作業で行うと、それは明らかです。
— gnasher729

1
@ gnasher729それは私にはまだはっきりしていません...
— Hinko Pih Pih

log_2(1,000,000)とは何ですか?次に、1,000,000個のアイテムを同じ数の同じサイズのサブ配列に分割した場合、それぞれの大きさはどれくらいですか?もう一度やったら?
— gnasher729

アレイを毎回部分に分割することはしません。最初のステップではありますが、などに分割します。log2⁡(1,000,000)log2⁡(1,000,000log2⁡(1,000,000))
— Hinko Pih Pih

あなたはなかったではない「ここで、nは部分配列の大きさである」、「ここで、nは配列の大きさである」と言います。実際にはほとんど違いはありません。
— gnasher729

回答:


5

ましょ、およびによって表すのアプリケーションの数、それが取得するのにかかるいくつかの任意の定数を下回ります。一方で、なので、 上限を取得するには、である限り、なので、をに減らすには、最大で反復が必要です。同じ議論がをに削減するために適用されますf(n)=n/log⁡ng(n)fnf(t)(n)≥n/logt⁡n

g(n)≥loglog⁡n⁡n=log⁡nlog⁡log⁡n.
f(t)(n)≥nlog⁡f(t)(n)≥(log⁡n)/2log(log⁡n)/2⁡n=O(log⁡n/log⁡log⁡n)nnnn4など、したがって (ここではと同じです。)注意してください 。大きな、(say)となるため、 したがって、和は収束幾何級数によって主化され、と結論付け 合計すると、
g(n)≪log⁡nlog⁡log⁡n+log⁡nlog⁡log⁡n+log⁡n4log⁡log⁡n4+⋯.
⋅≪⋅⋅=O(⋅)log⁡n=12log⁡nnlog⁡log⁡n≥23log⁡log⁡n
log⁡nlog⁡log⁡n≤23log⁡nlog⁡log⁡n.
g(n)=O(log⁡nlog⁡log⁡n).
g(n)=Θ(log⁡nlog⁡log⁡n).
より多くの作業を行うことで、おそらくなどのより洗練された推定値を証明でき
g(n)∼log⁡nlog⁡log⁡n.


は何を表していますか?t
— Hinko Pih Pih

を適用した回数です。f
— Yuval Filmus

最初の不等式からをどのように取得したかわかりません。g(n)≥loglog⁡n⁡n
— Hinko Pih Pih

方程式解くことによって。ここでは私の「任意の」定数です。n/logt⁡n=11
— Yuval Filmus

から回の繰り返しがどのように得られたかは理解できません。説明して頂けますか?log(log⁡n)/2⁡nlog⁡f(t)(n)≥(log⁡n)/2
— Hinko Pih Pih

2

反復対数を参照しているようです。log関数とも呼ばれます。これは、1以下の数値が生成されるまで、数値の対数を何回取ることができるかを表す関数です。log∗

関数は、非常にゆっくりと成長します。テトラションの逆です。log∗

詳しくはこちらをご覧ください。


2
反復対数ではありません。例:最初のステップでは、要素があり、それを部分に分けます。各部分にます。つまり、次のレベルでは、対数は取りません。サブアレイを部分に分割します。これは、よりもかなり多くなります。そして、このパターンは続きます。私は実際にプログラムおよび再帰の深さを書かれているよりも常に大きいとより常に小さい。nlog2⁡(n)nlog2⁡(n)log2⁡(nlog2⁡(n))log2⁡(log2⁡(n))log2⁡(log2⁡(n))log2⁡(n)
— Hinko Pih Pih

2

nを配列のサイズとします。k = log2(n)とします。最初のステップでは、kで割ります。配列のサイズが超える限り、k / 2以上で除算します。これはO(log n / log log n)だと思います。n1/2

(常にkの部分に分割する場合、log n / log kの分割が必要です。特別なケースk = log nを要求したため、log n / log log nを実行します。次に、kを縮小すると違いが生じるかどうかを判断する必要があります。)


ただし、サブアレイのサイズは、ある時点でより小さくなります。そして、それが真実ではなかったとしても、どのように取得したのか理解できません。n12O(log2⁡(n)log2⁡(log2⁡(n)))
— Hinko Pih Pih

あなたの編集された答えは定数良い説明を提供しますが、ここでは定数ではないので、それでもまだ役に立ちません。kk
— Hinko Pih Pih

1

以下のすべての対数は、底が2の対数、つまり意味します。log2⁡(⋅)


質問指定された関数に名前を付けます。(「強打」はから来るのでplitting ログ。また、「暗示できSよりmaller ログ」。)正確に言えば、 で、以下の条件によって定義されます。slogslogN

  • 基本ケース、およびslog⁡(1)=0slog⁡(2)=1.
  • 繰り返し関係、 forslog⁡(n)=1+slog(⌈n⌈log⁡n⌉⌉)n>2.

の漸近的な振る舞いslog⁡(n)に関する次の命題を証明できます。

limn→∞ slog(n)log⁡nlog⁡log⁡n=1.

これが証明の基本的な考え方です。

limn→∞log⁡nlog⁡log⁡n−log⁡nlog⁡nlog⁡log⁡nlog⁡n=limm→∞mlog⁡m−m−log⁡mlog⁡(m−log⁡m)=limm→∞mlog⁡m−m−log⁡mlog⁡m+log⁡(1−log⁡mm)=limm→∞(log⁡m)2+mlog⁡(1−log⁡mm)(log⁡m)(log⁡m+log⁡(1−log⁡mm))=limm→∞(log⁡m)2+m(−log⁡mm)(log⁡m)(log⁡m)=1

当然です。。slog(n)=Θ(log⁡nlog⁡log⁡n)


をに定義し、をに定義し、を定義しても、同じ結論が成り立ちます。。slog(x)x>1slog(x)=11<x≤2slog⁡(n)=1+slog(nlog⁡n)


運動。の完全な証明を書き。slog(n)∼log⁡nlog⁡log⁡n


ここでの漸近的な結果は、民間伝承または知られている必要があります。しかし、私はまだ参考文献を見つけていません。
— John L.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.