2012-02-13 6 views
0

私はかなり大きなツリーデータ構造を持っています(ノードの削除や追加など)。私は、すべてのノードを(7のような特定の幅の深さまで)訪問し、それをリストに入れる、幅広い最初のアプローチを使用してツリーを走査しなければなりません。次に、関数はノードをループし、情報がリストの内部にある場合はtrueを返します。最速のツリートラバーサル

これは、ノードをループするのに多くの時間がかかります。私はすべての単一のノードをすべての単一の子ノードにマップしてから、辞書を使用してノードをプルし、そのすべての子を(再帰的に)取得する必要があるとは思わない。私はこれをどのようにするべきですか?最速の方法は

Dictionary<Node, List<Node>>

  • ノード、すべての子のリスト(子供たちの子供を含む...)のように、互いの間のすべてのノードをマップすることで、その後のノードを引き、そのような2,000人の子供速い取得します。しかし、ノードがどこにでも追加または削除された場合、すべての辞書ノードを更新する必要があります(これは面倒なようです)。もう1つの方法は、実行中に動的にループすることです(時間がかかります)。これは、ツリーの生成中、または実行時にループする間に、すべてを最初から一緒にマッピングすることです。

この状況を処理する最善の方法は何ですか?任意のアイデア、ポインタ、コメント、任意のものが役立ちます。現在のところ、この操作にはプログラム実行時間の約25%が必要です。

+0

ツリー内のノードに特定の順序がありますか? –

+0

なぜあなたは 'Dictionary >'を持っていて、node.ChildNodesやそれらの行に何かがないのですか? – Alxandr

+0

AdamS - いいえツリーに順序がありません。これは、1対多の関係です。私がツリーを作成するとき、ノードをより速く見つけるために、「バイナリ検索ツリー」のようなノードを作成することについて賢明でなければなりませんか?私がノード3-4の子供を深く見つけているときに問題があると思われますが、中間のノードは彼らの子供が何であるかを何ら指示するものではありません。例えば。ルートノード - 23、1子 - 85 - その子 - 3921 - その子 - 39222.ルートノード "23"から39222を見つけようとしている場合、中間の子供はまったく異なっています(85,3921)。それはそれが見えるトリッキーになる? – iefpw

答えて

0

述語を評価するだけの場合は、ツリーをトラバースするときに直接行うことができます。リストをキャッシュしない限り、ツリー全体を最初にリストに入れる必要はありません。ツリーノード上の述語を直接評価することで、興味のある情報を最初に見つけたときに早期にトラバースを短絡/停止することができます。

+0

あなたの答えをありがとう。それは良い点です。すべてのノードを追加するのではなく、それに合ってそれを引っ張りなさい。もし私が何をしたいのか分からなくて、自分がしたいことが妥当であれば、すべてのノードをチェックすればどうなりますか? – iefpw

+0

@iefpw:どのような問題を解決しようとしていますか?おそらくあなたの問題のためのより良い/より最適化されたデータ構造があるでしょうか? – BrokenGlass