0

TextElements と ImageElements の配列を使用できる独自のマークアップ言語があるとします。これらはそれぞれ、「float: left/right/none」や「clear: none/left/right/both」などのプロパティを持つことができます。さらに、フローティングされていない要素は、フローティングされた要素の周りを流れることができます。基本的にはすべて CSS フロート レイアウトに似ています。

例えば:

Elem1 Elem2 Elem3 Elem4 Elem5 _ Elem6

レイアウト中にこれらの要素を格納するために使用する最適なデータ構造は何ですか? 次のような質問に簡単に答えられるものが必要です。

  • Element1 の左または右に Element2 を収めるのに十分なスペースがありますか?
  • Element1 のページ座標、原点、サイズは?

基本的に次のような構造を保存します。

{要素、原点(x、y)、サイズ(w、h)}

このデータ構造内の既にレイアウトされた各要素に対して。

RTree、QuadTree などがありますが、レイアウト アルゴリズムで使用するために、ページ上の四角形のレイアウトを抽象的に表現する単純なものが必要です。

注: 私は HTML でこれを行っていません。これは iOS アプリの要素のレイアウト用であり、以前の iOS バージョンをサポートする必要があるため、iOS 6 の制約を使用できません。

ありがとう!

4

1 に答える 1

0

バイナリヒープは、あなたが望むもののために働くことができると信じています。ウィキペディアは、バイナリ ヒープを非常によく説明しています。

バイナリ ヒープには、目的に適した 2 つのプロパティがあります。

  1. これは完全なツリーであり、要素がレイアウトされたページに構造的に似ています。
  2. ノードは、各ノードがその子よりも大きい (または必要に応じて小さい) ように並べられます。あなたの場合、「より大きい」とは、「さらに左に、上に向かって配置される」ことを意味します。

フロートがない場合、必要に応じて行を折り返して順番に配置される要素のリストがあります。したがって、float がない場合にヒープを構築すると、受け取った順序で単純にノードがツリーに追加されます。

フロートは、その前のノードよりも高く (右フロートの場合は後続のノードよりも低く) 配置されるため、これを複雑にします。幸いなことに、ヒープを構築すると、新しいノードを適切な場所にバブリングすることでこれが可能になります。そのため、浮動要素をそのピアに対して順序付けする関数を定義できる限り、これは機能します。

それについてはよくわかりませんが、残念ながら、今はそのアイデアをより完全に探求する時間がありません.

とにかく、正しいヒープがあると仮定すると、最上位の要素を繰り返し削除すると、ページに配置する順序でノードが列挙されます。

CHDataStructuresにはバイナリヒープがあると思いますが、ドキュメントが保管されているサーバーが投稿時点でオフラインのようであるため、確認できません。

頑張ってください。これがお役に立てば幸いです。

于 2012-11-28T07:10:35.307 に答える