2012-02-27 9 views
1

の深いマーク子供たちを見つける:効率的に(M-ウェイ)ツリーTを与えられたツリーノード

 A 
    /\ 
     B C 
    /\ \ 
    D* E* F 
/\ \ \ 
    G H* I J* 

マークされたノードDの*、E * H *およびJ *を使用すると、取得するための高速な方法がありますすべて指定されたノードの下にマークされた子、すべてのサブツリーを歩いたり、マークされたすべての子をすべてのノードに格納することは別ですか?私は:

B -> D*, E*, H* 
C -> J* 
A -> D*, E*, H*, J* 
+0

これをスピードアップするために中間結果を保存する方法はたくさんありますが、それ以上の文脈がなければ、何が役立つかは分かりません。 – trutheality

+3

@PhilBolducあなたが投稿する前に考えてください - ありがとうございます。 –

+0

@trutheality私はいくつかのUI作業のためにこれが必要です。基本的には、サブウィジェットは、親のサイズが変わるたびにサイズ変更イベントを受け取ることができなければなりません。つまり、ウィンドウがサイズ変更された場合、埋め込まれたテキストボックスはサイズ変更イベントを受け取る必要があります。 –

答えて

2

原則として、ツリーを歩いてマークされた値のリストを保存することとの間にトレードオフがあります。あなたは2つの極端なことを言いました、私はそれらの中間のどこかに座っている例をあなたに与えます。頭に浮かぶ

ひとつのアイデアはあなたの例では、それはあまり保存しないように、ストレージと時間のかなりバランスの取れたミックスを与える必要があり、各マークされたノード、でマークされ子供たちの次の「層」を記憶するが、ためていますたとえば、あなたが

 A 
    /\ 
     B* C 
    /\ \ 
    D* E F 
/\ \ \ 
    G H* I* J* 
//\ 
K L M 

を持っている場合は、H,I,JDと「空」のマーカーでBD,IHを格納します。あなただけのすべてのブランチがマークされたノードに当たるまで、例えば、Aためのリストを取得するために、あなたはA->BA->C->F->Jから歩いてしなければならないので、その後Bはあなたを与えるだろう、歩かなければならないノードのためのリストを取得するには

I,DDHとなります。あなたがこの場合も、元のツリーとだけ一緒にマークされたノードの木を記憶するものとして考えることができ

、2本の木

B  J 
/\ 
D I 
| 
H 

マークされたノードの分布に応じて、あなたがすることができるかもしれませんこのアイデアをアプリケーションに最適化します。

+0

これはいいアイデアのように思えます、ありがとう! –

0

まあ、少なくとも1回は木を歩かなければなりません。それより速い方法はありません。あなたはそれらを保管したくないので、毎回それらを歩かなければならないでしょう。

+0

私はそれらを保存しても大丈夫でしょう、私はマークされたすべてのリストすべてのサブノードのサブノード(それはすべての*ノードでなければなりません)。それらを保管する効率的な方法があれば - 私はそれのためにすべてです。 –

1

下に移動すると、ツリーのかなり小さな部分にアクセスできます。

木はという最小限のスペースで表現できます。すなわち、構造体のベクトル、「親ノード」インデックスと「マーク済みフラグ」以外のフルペイロード(ルートは-1)です。

for each node 
    if marked && given parent in parents'chain 
    ok, save (for instance) the index 
    endif 
next 

IMO、およびデータ配信統計に応じて、私はこれが効率的であると感じます。

1

現在のノードをルートとするサブツリーにマークされたノードがある場合に限り、すべてのノードに1ビット(またはboolean)を格納できます(true)。このラベル付けは、ツリーを更新しながら維持するのが容易で、再帰アルゴリズムと反復アルゴリズムの両方で簡単に不要なサブツリーをスキップできます。ただし、マークされたノードへのパス上のすべてのノードをトラバースする必要があります。

アクセスのためのオーバーヘッドを確保するが、維持することは難しいもう一つのアイデアは、マークされたすべてのノードに子ポインタの第2のペアを持たせることです。これらを使用すると、マークされたノードのツリーを小さなストレージオーバーヘッドで保存できます。この方法でマーキング自体をエンコードすることもできます。それらのポインタのうち少なくとも1つがnullでない場合にのみ、ノードがマークされます。根は特別な方法で扱われなければならない。

+0

私はフラグのアイデアが気に入っていますが、問題はあなたがまだ多くの中間のマークのないノードをたどる必要があるということです。しかし、あなたの2番目の提案(と私が正しく理解した場合、これは基本的にtruthealityのものと同じ考えです)実際にフラグが不要になり、私は何をするつもりですか? –

+0

@PhilipK最初の1つは、つまり、あなたは比較的多くのラベルを持っています。私は三位一体が何であるかを完全に理解していませんでした。 – Raphael

関連する問題