単純なアルゴリズムの簡単な最適化は、ウィンドウで覆われているポイントをチェックするときに、いくつかのポイントをスキップすることです。左から右、上から下にスキャンするとします。あなたが遭遇した場合(x 、y) ウィンドウ内 w = (l 、r 、w 、h )、からジャンプできます バツ に l + w + 1そして続けます。窓が大きく、重ならない場合、袖口から離れると、私はあなたにO (p ) アルゴリズム、場所 p 返すセットのポイント数です。
実際、ウィンドウが全体的に広いか高いかを確認することは有益です。背の高いウィンドウの場合は、上から下、左から右にスキャンすることをお勧めします。広いウィンドウの場合は、上記で説明した方法が適しています。アイデアを取り入れ、斜めにスキャン/スキップして、全体的にバランスの取れたパフォーマンスを得ることができる場合があります。
実際、左から右、上から下にスキャンすると、後で覚えることができます h 行(の値 y)同時にスキップする必要があること バツ 同じ値 l + w + 1 価値、あなたがに達した場合 バツ(重複する別のウィンドウがある場合は、そうでない可能性があります)。これにより、同等の良好なパフォーマンスを得るために、上から下、左から右、斜めのスキャンが不要になります。
より一般的には、2つのデータ構造があります。 O (1 ) 前処理/構築のオーバーヘッドと O (w ) ルックアップ、および O (p ) (おそらく、あなたはもっとうまくできるかもしれません、または私の最適化ではこれが実際に達成されないかもしれません)前処理/構築 O (1 ) (ハッシュ/ルックアップテーブル)または O (ログp )(BST)。したがって、すでに2つの代替案があり、どちらもかなり良い、本当に...