@supercat の正確で高速なソリューションについて詳しく説明し、そのような合計の長さを計算するだけでなく、最小の長さの合計を計算するアルゴリズムについて説明したいと思います。
アルゴリズム
t_k := 1 + 2 + 3 + ... + k >= |n| となる最小の整数 k を見つけます。t_k は |n| と同じパリティを持ちます。次に、体系的な方法で t_k の被加数の符号を反転させて合計 n にします。
詳細はこちら。t_k = k(k + 1)/2、三角数であることに注意してください。t_k = |n| の設定 k について解くと、(-1 + sqrt(1 + 8|n|))/2 の上限が得られます。したがって、k は上限、または 1 または 2 にそれを加えたものに等しく、これら 3 つの数値のいずれかで、n と同じパリティを持ち、最小になります。ここで、3 つの連続する三角数の集合 {t, t + s, t + s + (s + 1)} には、任意の正の整数 t, s に対して偶数と奇数の両方が含まれているという事実を使用しています。(単純に、t と s の 4 つのパリティの可能性をすべてチェックしてください。)
n の最小長の合計を見つけるには、最初に d := (t_k - n)/2 を計算します。t_k >= |n| なので t_k と n は同じパリティを持ち、d はセット {0, 1, 2, ..., t_k} にあります。ここで繰り返し減算します: d = a_k (k) + r_k, r_k = a_{k-1} (k-1) + r_{k-1}, ..., r_2 = a_1 (1) + r_1、各 a_i を選択{0, 1} で最大。以下の補題により、r_1 = 0. したがって、d = sum_{i=1}^k a_i i. したがって、n = t_k - 2d = sum_{i=1}^ki - sum_{i=1}^k 2a_i i = sum_{i=1}^k (1 - 2a_i) i と 1 - 2a_i は {-1 にあります。 、1}。したがって、シーケンス b_i := 1 - 2a_i はパスであり、k の最小性により、b_i は最小パスです。
アルゴリズム例
ターゲット数 n=12 を考えてみましょう。アルゴリズム 3 によると、k の可能性は 5、6、または 7 です。対応する t_k の値は 15、21、および 28 です。28 は n と同じパリティを持つこれらの最小値であるため、k=7 であることがわかります。 . したがって、d = (t_k - n)/2 = 8 となり、アルゴリズムに従って 1 + 7 と書きます。したがって、12 への最短経路は -1 + 2 + 3 + 4 + 5 + 6 - 7 です。
最短経路は一般に一意ではないため、最短経路と言います。たとえば、1 + 2 -3 + 4 - 5 + 6 + 7 も機能します。
アルゴリズムの正しさ
補題: A_k = {0, 1, 2, ..., t_k} とする。次に、{0, 1} のシーケンス a_i の合計 sum_{i=1}^k a_i i として表現できる場合にのみ、数値は A_k にあります。
証明: k の帰納法による。まず、0 = sum_{i=1}^0 1、空の合計。ここで、すべての k - 1 >= 0 に対して結果が成り立つと仮定し、数値 d が A_k にあると仮定します。繰り返し減算: d = a_k (k) + r_k、r_k = a_{k-1} (k-1) + r_{k-1}、...、各 a_i = 0 または 1 を {0, 1 で最大に選択} そして、最初の r_j が A_j にあるとき、いくつかの j < k で停止します。次に帰納仮説により、{0, 1} の一部の b_i について r_j = sum_{i=0}^j b_i i となります。次に、必要に応じて d = r_j + sum_{i=j+1}^k a_k i となります。逆に、a sum s := sum_{i=1}^k a_i i for a_i in {0,1} は 0 <= s <= sum_{i}^ki = t_k を満たすため、s は A_k にあります。
アルゴリズム時間の複雑さ
算術演算が一定時間であると仮定すると、n から k を計算するのに O(1) 時間かかるため、n への最小パスの長さになります。次に、d の最小長の合計を見つけるのに O(k) 時間がかかり、その合計を使用して n の最小長の合計を生成するのに O(k) 時間がかかります。したがって、O(k) = O(sqrt(n)) 時間はすべてアップします。