回答:
次の観察から始めましょう。
してみましょう意味に、シーケンスの最大、と聞かせその最小値を示します。場合、が最適です。1、。。。、a n m i n a 1 = m a x b 1 = b 2 = 。。。= B N = ⌊ (M A X + mはiがN )/ 2 ⌋
これはなぜですか?さて、シーケンスは最大で始まるため、 large を選択し、シーケンスの最小値から大きな偏差を被る(後続のはb_1以上でなければならないため)か、 small を選択して偏差。平均は最大偏差を最小化します。
この観察結果を一般化して、一般的なシーケンスa_1、...、a_nで使用することができます。たとえば、任意のシーケンスをサブシーケンスに分割して、それぞれがそれぞれのサブシーケンスの最大値で始まるようにすることができます。
例:は、、および。(2 )(6 、4 、1 、5 、2 )(8 、7 、5 、1 )
この分割を考えると、これらの各サブシーケンスを個別に解決し、の割り当てを取得できますが、これは非減少条件に違反する可能性があります。これは、最適性を失うことなく修正できます。
最後のサブシーケンスが常に最大含まれていることを確認してシーケンス全体のを(そうでなければ、後に別のサブシーケンスが存在することになります)。ましょう我々はに割り当てられた値であるサブ。さて、非decreasingnessを達成するために、我々はに戻ってから開始とフロントに私たちのように動作します。場合より大きい、単純に設定。小さい場合は保持します。次に、となどを比較します。を値まで下げることに注意してください、W 1、wは2、。。。、W k個の K W 1、。。。、w k w k w k − 1 w k w k − 1:= w k w k − 2 w k − 1 w i w i + 1 w i w i + 1割り当てサブシーケンスにおけるmaximium値ので、偏差を増加させることはない用いて割り当てられたサブシーケンスに常に低い最大値よりも。
このアルゴリズムは正しいはずです。実行時間に関して、重要なステップは、サブシーケンスの増加する最大値を計算することです。これは可能ですか?がどこに貢献しているかわからない。l
ここでは、あなたが与えたヒントを使って作業するだけで大声で考えます。が最初に試すべきであると言う元のヒントに行きましょう。その時間を持つ貪欲なアルゴリズムを考えることができます。
時間の複雑さの部分は、各値各出現回数のリストを保持できることを意味します。つまり、セット内の各のカウントを追跡するセットを作成するだけです。入力シーケンスを1回スキャンすることで、初期化リストを作成できます。0 .. l Count = C 0、… 、C l l
でこのリストをスキャンして、最大値と最小値を取得できます。この中間点でリスト全体を埋めると、分散はこの値と最大/最小との差になります。これは基本的に最悪のシナリオですと呼びましょう。b b w
だからあなたの方法を働きますカウントb [ i + 1 ] … b [ n ] O (l )b i > b w b [ i − 1 ] a i b i左。この要素をからドロップし、のの最小/最大を取得できます。今、私たちは貪欲になることができます。選択しないのは、リスト全体を強制的に(非減少要件を満たすために)上げ、分散を増加させるためです。選択できる最小値はです。場合許容範囲内にある使用より範囲を最小以下の場合、私たちは、それを選択します。これにより、既知の制約が与えられると、の分散が最小になります。
これは単なるアイデアであり、おそらく私は幸運であり、正しい方向を示しています。このアルゴリズムは機能しない可能性があります(私の簡単なテストでは機能します)が、与えられたヒントと一致するため、おそらく役立つでしょう。正しい場合は、部分を確実ににドロップできることを確認するのは簡単です。さらに詳しくはわかりません。O (log l )
以下は教授の解法であり、彼は「縮小」と呼んでいますからまでの各について、偏差が以下であることがわかっている場合は解の構築を試みます。解を見つけることができる最初のは最小偏差です。時間の偏差から解を見つけることができます。したがって、実行時間はです。次に、線形検索を使用する代わりに、バイナリ検索を使用して、解が可能な最小偏差を決定できます。これにより、実行時間がに短縮され、の要件が満たされます。0 L I I O (N )O (N L )O (N ログL )O (N 4 √
これはO(n)で実行できるはずだと思います。
同様の問題を考えてみましょう:、、、ような非降順でを見つけます全てのiについて、またはそれが不可能であることを示しています。これはO(n)で行うことができ、バイナリ検索を使用して元の問題はO(n log l)で解決されます。b i | a i − b i | ≤ D
a_i-a_j> 2dのようなi≤jがある場合、解はありません(なぜなら )。
しかし、すべてのi≤jに対してa_i-a_j≤2dの場合、常に解決策が見つかると思います。しなければならないのは、すべてのi≤jについてm = max(a_i-a_j)を見つけ、d = floor((m + 1)/ 2)を選択することだけです。その最大値はO(n)にあります。