ウィンドウが表示されている画面を表すための効率的なクエリ可能なデータ構造


7

(これは私の他の質問に関連しています、ここを参照してください

3つのウィンドウがある画面を想像してください。

ここに画像の説明を入力してください

これらをサポートしながら、これを表す効率的なデータ構造を見つけたいのですが。

  • 特定のウィンドウを他のウィンドウと重複せずに配置できる座標のリストを返します
    • 上記の例で、サイズ2x2のウィンドウを挿入する場合、可能な位置は(8、6)、(8、7)、..になります。
  • アスペクト比を維持しながら、他のウィンドウと重ならないように画面上のウィンドウのサイズを変更する
  • x、yの位置にウィンドウを挿入します(ウィンドウが重ならない場合)

今の私の素朴なアプローチは、ウィンドウの配列を維持し、画面上のすべてのポイントを調べて、ウィンドウのいずれかにあるかどうかをチェックすることです。これは、ここで、画面の幅、高さであり、それにウィンドウの数です。一般に、各ウィンドウが多くのスペースをとる場合、は小さくなります(たとえば、<10)。Oメートルwメートルww


好奇心から、なぜ一連のポイントが必要なのですか?他の問題を解決する場合は、根本的に優れたアプローチがあるかもしれません。ウィンドウがない場合でも、それはまだでしょうかOメートルソリューションを構築するには、つまり、赤い長方形のすべてのポイントですか?ポイントのセットをどのように表現しますか?
Patrick87 2012

@ Patrick87:あなたは正しい、そしておそらく私はこれを間違った方向に近づけようとしている。質問を編集します。
daniel.jackson 2012

回答:


3

単純なアルゴリズムの簡単な最適化は、ウィンドウで覆われているポイントをチェックするときに、いくつかのポイントをスキップすることです。左から右、上から下にスキャンするとします。あなたが遭遇した場合バツy ウィンドウ内 w=lrwh、からジャンプできます バツl+w+1そして続けます。窓が大きく、重ならない場合、袖口から離れると、私はあなたにOp アルゴリズム、場所 p 返すセットのポイント数です。

実際、ウィンドウが全体的に広いか高いかを確認することは有益です。背の高いウィンドウの場合は、上から下、左から右にスキャンすることをお勧めします。広いウィンドウの場合は、上記で説明した方法が適しています。アイデアを取り入れ、斜めにスキャン/スキップして、全体的にバランスの取れたパフォーマンスを得ることができる場合があります。

実際、左から右、上から下にスキャンすると、後で覚えることができます h 行(の値 y)同時にスキップする必要があること バツ 同じ値 l+w+1 価値、あなたがに達した場合 バツ(重複する別のウィンドウがある場合は、そうでない可能性があります)。これにより、同等の良好なパフォーマンスを得るために、上から下、左から右、斜めのスキャンが不要になります。

より一般的には、2つのデータ構造があります。 O1 前処理/構築のオーバーヘッドと Ow ルックアップ、および Op (おそらく、あなたはもっとうまくできるかもしれません、または私の最適化ではこれが実際に達成されないかもしれません)前処理/構築 O1 (ハッシュ/ルックアップテーブル)または Oログp(BST)。したがって、すでに2つの代替案があり、どちらもかなり良い、本当に...


3番目の段落で説明したことをどのように達成しますか?現在、すべてのウィンドウを調べて最初の提案を実装しました。重複がある場合はスキップします。これは、私がフィットしようとしている現在のウィンドウの(x、y)座標が1回の反復で変化しないまでループで実行されます。
daniel.jackson 2012

たぶん、中央の要素がハッシュを決定する(y-counter、left、right)トリプルのハッシュテーブルを維持します。1つ追加して、長方形にヒットしたときに(y + h、x-1、l + w + 1)に初期化します。長方形をスキャンする前にテーブルを確認してください。y> y_maxの場合、無視して削除します。そのようなものかもしれません
Patrick87 2012
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.