最大セグメントで共有されるポイントを見つける


7

与えられた: N 順序付けられた整数のセグメント(配列)、整数は KK

例:

Segment 1: [-2,-1,0,1,2,3]
Segment 2: [1,2,3,4,5]
Segment 3: [-3,-2,-1,0,1]

それらを[min、max] ---として表すことができます---同等です:

Segment 1: [-2,3]
Segment 2: [1,5]
Segment 3: [-3,1]

セグメントの最大数に属する整数を見つけるにはどうすればよいですか?この例では、1です。

私は最も効率的なアルゴリズムを探します。

回答:


11

使ってみよう + セグメントの開始を示し、 終わりを示します。各セグメントについて、各エンドポイントに1つずつ、2つのペアを作成します。

Segment1: (-2, +), (3, -)
Segment2: (1, +), (5, -)
Segment3: (-3, +), (1, -)

並べ替え 2N最初の座標でペアにします(等しい場合は-の前に+を付けます)。あなたは時間内にこれを行うことができますONログN 適切な並べ替えアルゴリズムを使用して、または時間内に ON+Kキーインデックス付きカウントを使用します。この例では、次のようになります。

(-3, +)
(-2, +)
(1, +)
(1, -)
(3, -)
(5, -)

次に、エンドポイントを順番に処理します。アクティブなセグメントの数のカウントを維持します。最初は0です。+、カウントを1ずつ増やします。 、カウントを1つ減らします。各エンドポイントを処理した後、新しいカウントがこれまでの最大カウントよりも高いかどうかを確認します。正しい場合は、ソリューションを更新してください。

(-3, +) -> count=1, max_count=0, sol=-3
(-2, +) -> count=2, max_count=1, sol=-2
(1, +) -> count=3, max_count=2, sol=1
(1, -) -> count=2, max_count=3, sol=1
(3, -) -> count=1, max_count=3, sol=1
(5, -) -> count=0, max_count=3, sol=1

アルゴリズムのこの第2フェーズは、時間に比例してかかります N。アルゴリズム全体に時間がかかるONログN ジェネリックソート、または ON+K キーインデックス付きのカウント。


1
セグメントツリーを使用する代替ソリューションがあります。しかし、漸近的なコストは同じです。
ヴィンチェンツォ

1
エンドポイントは制限された整数なので、並べ替えフェーズをスキップして、すべての位置(4 K整数)の「in」と「out」の数を数えることもできます。
Optidad

@Vinceは、クローズ/オープンインターバルの終了を考慮する必要があります。それが4 in 4 Kだと思いますか?
John Dvorak

ありがとう。答えがブードゥー教のように見えるという私の問題。問題は解決しますが、適切に説明できる説明はありません。とりあえず、次のように説明します。「左から右に行くと、数が増え、共通のポイントが見つかります。一方、Unionのように開始し、互いに追加するセグメントが増えています。右から左に行くと、同じですが、この方向に以前の方向よりも共通点が多い場合はカウンターを上げます... "しかし、この"方向の競争 "が正しい結果をもたらす理由は明らかです...簡単ではありません...
ウラジミールナボコフ

@VladimirNabokov、主なアイデアは、第2フェーズでは、特定のポイントのカウント変数がそのポイントと交差するセグメントの数に等しいということです。ちなみに、左から右へのトラバースは1つだけです。アルゴリズムが1つのセグメントのみの場合と2つのセグメントのみの場合に機能する理由を最初に理解すれば、アルゴリズムを理解するのは簡単だと思います。
Vincenzo

1

すべて0で初期化されたサイズ2 * k + 1の配列を作成してみましょう。[L、R]の形式の各セグメントについて、L 番目のインデックスに1を加算し、R + 1 番目のインデックスから1を減算します。

Note : We add K to every values to shift the range from -K to +K to 0 to 2*K.

結果を取得するために、前置合計を実行します。

array[i] = array[i-1] + array[i], where 1 <= i <= 2*K ( assuming 0-based indexing)

してみましょう私は、最大値を持つインデックスです。次に、答えはiKになります。
尋ねられた例を解決しましょう:

Let K = 5 and segments are [-2, 3], [1, 5] and [-3, 1]. Then after adding K the segments become
[3, 8], [6, 10] and [2, 6].
On performing the +1 and -1 updates our array will be
[0, 0, 1, 1, 0, 0, 1, -1, 0, -1, 0, -1].
Prefix sum will result into 
[0, 0, 1, 2, 2, 2, 3, 2, 2, 1, 1, 0].
Hence the index with max value is 6 and hence answer will be 6 - 5 = 1.

上記のアプローチの時間の複雑さはO(max(N、K))になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.