関数アプリケーションの最大数を期待して、一般的な戦略について説明します。3ケースあります。すべての場合で x < y と仮定します。ソース母集団とターゲット母集団の数値をビット文字列 X と Y と考えてください。
ケース 1 X と Y が最上位ビットでビットごとに一致する場合。
A(x) = x + 1 ----> 最下位ビットが 0 の場合、1 に変更します。 C(x) = x + x = 2*x ----> x ビット列を 1 だけ左にシフトします
例えば
x = 9 and y = 37, so
X = 1001, Y= 100101
したがって、上記から、C を 2 回 9+9 ---> 18 + 18 ---> 36 または X = 10010 (18)、次に 100100 (36) として、X を 2 だけ左にシフトし、1 を加えて 37 を得ることができます。
X = {1001,10010,100100,100101}
というわけで応募は3つ。したがって、ケース 1 の戦略は、C と A を繰り返し適用し、X を構築して Y をビットごとに一致させることです。これには、シフトごとに 1 つの C 操作と、1 を作成するための 1 つの A 操作が必要です。したがって、1 の場合、Length(Y) - Length(X) (C 操作の数) + 最下位の 1 の数が必要になります。 Y のビット (A 演算)。最悪の場合、すべて 1 または 2*(長さ (Y) - 長さ (X)) になります。この場合、B を使用しても役に立ちません。最悪の場合は O(Length(Y)) = O(log(y)) になります
ケース 2 (x < 2)
この場合、B を使用すると C よりも速く X に追加され、場合によっては (上記のように) ケース 1 の一般的な戦略の代わりに B を使用する方が 1 優れています。
したがって、x = 1 かつ y = 7 の場合、代わりに
X = {1, 10, 11, 110, 111}, you can skip one step by using B
X = {1, 11, 110, 111}
ケース 3. X と Y に互換性がない。
X と Y の最上位ビットが一致しない場合は、B と A を適用して X を修正する必要があります。
例
X = 110 (6) Y = 101011 (43)
strat X = {110,1000,1010,10100,10101,101010,101011}
上で、X は上位 4 つの有効ビットで Y と一致するように固定され、それが達成されると、ケース 1 の strat を使用します。緩やかな上限は x/2 になります (B x/2 回 = x を適用します)。
全体的な複雑さは O(x) + O(log(y)) であると予測され、これは一般に受け入れられた回答のグラフと一致しているように見えます。