効果的な方法で配列の長さを決定するにはどうすればよいですか?
Intersystems Cache で配列またはグローバルのサイズを取得する方法を探しているときに、配列のサイズを実際に決定する方法を考え始めました。それ以来、元の問題の解決策を見つけましたが、配列のサイズを効果的に決定するパズルはまだ私を悩ませているので、これまでに思いついたものは次のとおりです。
- インデックス 1 から開始します。
- 現在のインデックスで値をテストします。
- 値が見つかった場合は、インデックスを 2 倍にします。
- 値が見つからない場合は、使用された最後から 2 番目のインデックスを減算します。
- 手順 4 に進み、値が再び検出されるのに十分なほどインデックスが小さくなるまで、反復ごとに減算された値を半分にします。
- 値が見つからなくなるまで、インデックスを 1 ずつ増やします。
- 最後から 2 番目のインデックスがサイズになります。
例として、サイズ 52 の配列を見てみましょう。
1 - OK
2 - OK
4 - OK
8 - OK
16 - OK
32 - OK
64 - OVER
48 - OK (64-16)
49 - OK
50 - OK
51 - OK
52 - OK
53 - OVER
13回の反復で配列の長さを取得するため、これは公平に思えますが、配列のサイズが63に増加すると、反復が10増加します-配列が増加したのと同じサイズです。
かなり小さい配列の場合、配列の長さが 2 のべき乗より 1 だけ少ない場合でも、最後の数ループで受けるノックはほとんど許容できると考えることができますが、非常に大きな配列を使用するとどうなりますか。 2097152 (2^21 - 1) 要素? つまり、21 回の反復で最初の「オーバー」に到達し、インデックスを 1572864 まで下げて、非常に長いループ (1572864 回の反復) を開始します。この例では、私はそれほど「勝っている」わけではありません。
これで、もう一度インデックスを 2 のべき乗で増やすことでこれを最適化できますが、これらすべてが疑問に思いました。それを行うためのより良い方法はありますか? 私はリモートで正しい軌道に乗っていますか? 単純に静的増加サイズを使用したほうがよいでしょうか?