:インデックスに基づいてピラミッドの行を検索しますか?以下のようなピラミッド考える
0
1 2
3 4 5
6 7 8 9
...
とi
はピラミッドのi
番目の番号を表しピラミッドi
のインデックスを与えられたが、i
番目の要素への行のインデックスを検索する方法があります属している? (i = 6,7,8,9
場合例えば、それは行0から開始して、3行目にある)
:インデックスに基づいてピラミッドの行を検索しますか?以下のようなピラミッド考える
0
1 2
3 4 5
6 7 8 9
...
とi
はピラミッドのi
番目の番号を表しピラミッドi
のインデックスを与えられたが、i
番目の要素への行のインデックスを検索する方法があります属している? (i = 6,7,8,9
場合例えば、それは行0から開始して、3行目にある)
行番号と三角数字の間には接続があります。 nth triangular numberは、T nと表され、T n = n(n-1)/ 2で与えられる。最初の2つの三角形の数字は0,1,3,6,10,15などです。各行の開始点はn番目の三角形の数字で示されています(この三角形から来ているという事実はこの名前はどこから来ますか)
本当にここでの目標は、T n ≤であるような最大のnを決定することです。あなたは私よりも大きな何かを見つけるまで、すべての巧妙な数学をやってなければ、あなただけのコンピューティングT 、T 、T などによって時間O(√ N)でこれを解決することができます。さらに良いことに、あなたの可能性あなたがオーバーシュートするまでの範囲で、等バイナリ検索をT 、T 、T 、T を計算することによって時間O(ログn)にそれのためのバイナリサーチあなたが見つかりました。
また、これを直接解決することもできます。我々は拡大など
n(nは+ 1)/ 2 = I
ことn個の選択肢を見つけたいと仮定し、我々は
N /2 +を取得しますn/2 = iである。
同等、
N /2 + N/2 - I = 0、
又は、より容易:
N + n-2i = 0である。
今は次の式を使用:
N =(-1 ± √(1 + 8I))/ 2
我々は無視することができる負ルートので、値をn個の私たちは望ん
N =(-1 + √(1 + 8I))/ 2
01です
この数は、必ずしもそうしたい行を見つけるために、整数ではありません、私たちは切り捨て:
行=&lfloorを、( - 1 + √(1 + 8I))/ 2&rf ;;コードで
:
int row = int((-1 + sqrt(1 + 8 * i))/2);
のは、これは少しそれをテストすることで動作することを確認してみましょう。 9はどこに行くの?さて、我々は
を有する(-1 + √(1 + 72))/ 2 =(-1 + √ 73)/ 2 = 3.77
ダウン丸め、我々はそれが行に進む参照します3 - 正しいです!
別のものを試して、55はどこに行くのですか?さて、
(-1 + √(1 + 440))/ 2 =(√ 441から1)/ 2 = 10
だから行10第10三角数を行くべきT = 55なので、実際には55行目から始まります。それは動作するように見えます! +(n iは電話番号
本質上記男と同じであるが、私はnに + Nを低減 -
Iはi
番目の要素はn
は、例えばi = 6
場合、n = 3
n(n+1)/2 <= 6
ためn(n+1)/2 <= i < (n+1)(n+2)/2
の数であるn
行目に属すると思います 、i = 8
の場合はn = 3
なのでn(n+1)/2 <= 8
Iは、行= math.floor(0.5√(2I + 0.25))を取得します0.5)-0.25