欲張りアルゴリズムを使用して、指定されたシーケンスに最も近い非減少シーケンスを見つける方法は?


20

n個の整数すべてと間で与えられます。各整数下に、からまでの整数を書き込む必要がありますが非減少シーケンスを形成するという要件があります。そのようなシーケンスの偏差を定義します。実行時O(n \ sqrt [4] {l})で最小偏差を持つb_iを見つけるアルゴリズムを設計します。a1,…,an0laibi0lbiB I O (nは4 √max(|a1−b1|,…,|an−bn|)biO(nl4)

正直に言って、この問題を解決する方法すら全くわかりません。動的プログラミングの質問のように見えますが、教授は貪欲なアルゴリズムを使用してこれを解決する必要があると言いました。誰かが小さなヒントを与えることで私を正しい方向に向けることができれば幸いです。

回答:


9

次の観察から始めましょう。

してみましょう意味に、シーケンスの最大、と聞かせその最小値を示します。場合、が最適です。1、。。。、a n m i n a 1 = m a x b 1 = b 2 = 。。。= B N = ⌊ (M A X + mはiがN )/ 2 ⌋maxa1,...,anmina1=maxb1=b2=...=bn=⌊(max+min)/2⌋

これはなぜですか?さて、シーケンスは最大で始まるため、b1 large を選択し、シーケンスの最小値から大きな偏差を被る(後続のbiはb_1以上でなければならないためb1)か、b1 small を選択して偏差max。平均は最大偏差を最小化します。

この観察結果を一般化して、一般的なシーケンスa_1、...、a_nで使用することができますa1,...,an。たとえば、任意のシーケンスをサブシーケンスに分割して、それぞれがそれぞれのサブシーケンスの最大値で始まるようにすることができます。

例:は、、および。(2 )(6 、4 、1 、5 、2 )(8 、7 、5 、1 )(2,6,4,1,5,2,8,7,5,1)(2)(6,4,1,5,2)(8,7,5,1)

この分割を考えると、これらの各サブシーケンスを個別に解決し、の割り当てを取得できますが、これは非減少条件に違反する可能性があります。これは、最適性を失うことなく修正できます。bi

最後のサブシーケンスが常に最大含まれていることを確認してシーケンス全体のを(そうでなければ、後に別のサブシーケンスが存在することになります)。ましょう我々はに割り当てられた値であるサブ。さて、非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 + 1maxw1,w2,...,wkkw1,...,wkwkwk−1wkwk−1:=wkwk−2wk−1wiwi+1割り当てサブシーケンスにおけるmaximium値ので、偏差を増加させることはない用いて割り当てられたサブシーケンスに常に低い最大値よりも。wiwi+1

このアルゴリズムは正しいはずです。実行時間に関して、重要なステップは、サブシーケンスの増加する最大値を計算することです。これは可能ですか?がどこに貢献しているかわからない。lO(n)l


2

ここでは、あなたが与えたヒントを使って作業するだけで大​​声で考えます。が最初に試すべきであると言う元のヒントに行きましょう。その時間を持つ貪欲なアルゴリズムを考えることができます。O(nl)

時間の複雑さの部分は、各値各出現回数のリストを保持できることを意味します。つまり、セット内の各のカウントを追跡するセットを作成するだけです。入力シーケンスを1回スキャンすることで、初期化リストを作成できます。0 .. l Count = C 0、… 、C l ll0..lCount=C0,…,Cll

でこのリストをスキャンして、最大値と最小値を取得できます。この中間点でリスト全体を埋めると、分散はこの値と最大/最小との差になります。これは基本的に最悪のシナリオですと呼びましょう。b b wO(l)bbw

だからあなたの方法を働きますカウントb [ i + 1 ] … b [ n ] O (l )b i > b w b [ i − 1 ] a i b ibi左。この要素をからドロップし、のの最小/最大を取得できます。今、私たちは貪欲になることができます。選択しないのは、リスト全体を強制的に(非減少要件を満たすために)上げ、分散を増加させるためです。選択できる最小値はです。場合許容範囲内にある使用より範囲を最小以下の場合、私たちは、それを選択します。これにより、既知の制約が与えられると、の分散が最小になります。Countb[i+1]…b[n]O(l)bi>bwb[i−1]aibi

これは単なるアイデアであり、おそらく私は幸運であり、正しい方向を示しています。このアルゴリズムは機能しない可能性があります(私の簡単なテストでは機能します)が、与えられたヒントと一致するため、おそらく役立つでしょう。正しい場合は、部分を確実ににドロップできることを確認するのは簡単です。さらに詳しくはわかりません。O (log l )O(l)O(log⁡l)


2

以下は教授の解法であり、彼は「縮小」と呼んでいますからまでの各について、偏差が以下であることがわかっている場合は解の構築を試みます。解を見つけることができる最初のは最小偏差です。時間の偏差から解を見つけることができます。したがって、実行時間はです。次に、線形検索を使用する代わりに、バイナリ検索を使用して、解が可能な最小偏差を決定できます。これにより、実行時間がに短縮され、の要件が満たされます。0 L I I O (N )O (N L )O (N ログL )O (N 4 √i0liiO(n)O(nl)O(nlog⁡l)O(nl4)


4
だから、のトリックだった...しかし、私はもっと興味をそそらだということをどのように..「我々はO(n)の時間のずれを与えられた解決策を見つけることができます」ではありません面白い部分は?O(nl4)
— jmad

@jmad与えられていない、それぞれの、取る以前のすべてとして大きなとして少なくともある最低値として、および以下であるから離れて。そのような値が見つからない場合、それはどういう意味ですか?これは、以前のことを意味し以上であるよりも大きい。したがって、以前のはより以上大きくなり。そのため、値は不可能でした。あなたがを介して取得した場合次のように立ち往生することなく、値、あなたがのための解決策を発見したj b j b k i a j b t i a j a t 2 i a j i n i O (n )ijbjbkiajbtiajat2iajiniバックトラッキングなしで、時間。O(n)
— JWG

O(n log l)は、0〜lの範囲でバイナリ検索を行う必要があるという強力なヒントになります。
— gnasher729

0

これはO(n)で実行できるはずだと思います。

同様の問題を考えてみましょう:、、、ような非降順でを見つけます全てのiについて、またはそれが不可能であることを示しています。これはO(n)で行うことができ、バイナリ検索を使用して元の問題はO(n log l)で解決されます。b i | a i − b i | ≤ Daibi|ai−bi|≤d

a_i-a_j> 2dのようなi≤jがある場合、解はありません(なぜなら bi≥ai−d,bj≤aj+d<ai−2d+d=ai−d≤bi)。

しかし、すべてのi≤jに対してa_i-a_j≤2dの場合、常に解決策が見つかると思います。しなければならないのは、すべてのi≤jについてm = max(a_i-a_j)を見つけ、d = floor((m + 1)/ 2)を選択することだけです。その最大値はO(n)にあります。


興味深いアイデア!私はこのようなことがうまくいくと信じていますが、あなたの答えの最後に大きなギャップがあり、詳細を記入するのに苦労しているようです。すべてのに対して場合、解決策が常に存在するという証拠がありますか?さらに重要なことは、どのようにしてそれを見つけるかということです。元の質問は、見つけなければならないことを示しています。解決策が存在すると仮定しても、対応するを見つける方法がわかりません。それについて詳しく説明していただけますか?I ≤ jのB I B Iai−aj≤2di≤jbibi
— DW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.