2016-06-11 4 views
0

したがって、基本的には、点よりも厳密に小さい座標を持つ最大値を持つ平面上の点を把握する方法が必要です。面内の点を最大化

これを実行する1つの方法は、複雑さのあるすべての点をチェックすることです。

O(N) time, N being the number of points. 
O(1) space. 

もう一つの方法は、(バイナリインデックス付き木複雑

O(log(max(X))*log(max(Y)) time, X being the maximum x coordinate and Y being the max y coordinate. 
O(max(X)*max(Y)) space, this is the main problem, I can't afford that much space. 
私は、対数複雑さとOにできるだけ近くを持っている何かをしたいと思います

を与えるだろう(BIT)でそれを行うことであろうN)スペース。

例:各ポイントの

Example

ベストな値は次のとおりです。あなたがしている場合

A -> 0 (none) 
B -> 2 (A) 
C -> 2 (A) 
D -> 0 (none) 
E -> 10 (D) 

答えて

1

は、ここでO(N Nをログ)建設時間(O(N)と、アルゴリズムの野心的であり、空想的なデータ構造の1つを実装する)と、空間およびO(ログN)時間のクエリ。

アイデアは、O(Nログ)時間挿入を有する1D問題に増分溶液を取り、リンクされたWikipediaのページに記載されている標準的な技術を使用して、中央データ構造(平衡二分探索木)partially persistentを作ることです。 2Dデータ構造を構築するには、ポイントをxだけソートしてから1D構造に順番に挿入し、xでソートされたリスト内の1Dスナップショットへの参照を保存します。 2D構造を照会するには、point.x≥query.xのポイントを挿入する前に最後のスナップショットをバイナリ検索してから、1Dクエリを実行します。

y軸の1次元問題を解くために、の非支配のポイントをバランスの取れたバイナリ検索ツリーに保ちます。 (より小さいy値以上の別のポイントがある場合、ポイントが支配されます。)クエリーを実行するには、ツリー内のquery.yの先祖を探します。挿入するには、最初にyを照会して、新しいポイントが支配されていないことを確認します。それが支配的でない場合は、それを挿入し、それを支配した後にポイントを削除します。償却された挿入時間はO(log N)である。

+0

私はほとんどあなたの解を理解していますが、xとyの解をどのように組み合わせて2Dの解にするのか本当に分かりません。 基本的に、目標値を厳密に上回るポイントを最高の値で照会し、その先の座標が優位になるようにそのポイントのy軸上の先行座標を探していますか? もしそうなら、その要素のyの値がターゲットより厳密に小さいことをどのように知っていますか? – RazvanD

+0

@RazvanD左から右の各点について、その点を上から下にソートされたツリーに挿入します(支配的な点を破棄します)。各ポイントの後、私たちはツリーをスナップショットします。これらの点のみを持つツリーのバージョンを選択することで、結果ポイントのx座標が小さくなるようにします。スナップショット内のクエリのy座標の先祖を選択することによって、y座標が小さくなるようにします。 –

+0

申し訳ありませんが、私はそれを持っていると思う、ありがとう! :) – RazvanD

関連する問題