2008-09-16 6 views
3

私は、20代のどこかに深さのツリーオブジェクトのセットを持っています。このツリーの各ノードはツリーのルートにアクセスする必要があります。グローバルを削除しますか?

ソリューションのカップル:各ノードが直接ルートへの参照を格納することができ

  1. (廃棄物のメモリ)私は、実行時にルートを計算することができます
    • 「上がり」による(廃棄物・サイクル)
私は、静的フィールドを使用することができます(ただし、これはグローバル変数になります)

グローバル(いずれのバリエーションでも)を使用しない設計を提供することができますが、メモリまたはサイクルの両方で#1または#2より効率的です。

編集:私はツリーのセットを持っているので、ツリー間を区別するのが難しいので、単に静的に格納することはできません。 (ありがとうmaccullt)

+0

木の森がある場合は、いくつかの根が必要な場合、または1つの根がある場合は、それは明確ではありません。森林の場合、統計があなたの問題をどのように解決するかは分かりません。ツリーごとに1つのルートが必要ではなく、各ツリーはルートを参照します(ソリューション1)。 – maccullt

答えて

6

それを必要とするノード内の機能にパラメータとしてルートを渡します。

編集:オプションは、本当に次のとおりです。

  1. ストアノード
  2. のルート参照がすべて
  3. ストアグローバル
  4. のルートの参照でのルートの参照を保管しないでください
  5. スタックにルート参照を格納する(私の提案、訪問者のパターンか再帰的か)

私はこれすべてのth可能性はありません。オプションはありません。

+0

アラ訪問者のパターンはきちんとしています。私はそれを考えなかった。 –

+0

何かが変わったとき、特に呼び出しスタックが深くなると、非常に痛い傾向にあるfindでは、 –

+0

私はそれを再帰的なものとして解釈していませんでした。ツリーを横断して各ノードで実行するコードを作成できます。そのコードはルートへの参照を持ちます。 –

3

なぜグローバルで処理する必要がありますか?私はグローバルの悪影響がすべてではないことを理解していますが、時にはすべての要素を含むグローバルなデータ構造を持つことが最速の解決策です。

パフォーマンスを向上させるために、コードの明快さと将来的な問題のトレードオフがあります。それは、「まだ最適化しない」という意味です。あなたが最適化段階にいるので、時にはパフォーマンスに有利ないくつかの読みやすさと良いプログラミング方法を取り除く必要があることがあります。つまり、ビットごとのハックは読み込みできませんが、高速です。

あなたのツリーオブジェクトの数はわかりませんが、私は個人的にオプション1を使用します。何千もの木を扱っていない限り、ポインタは実際には数文字列にはならないでしょう。メモリが本当に重要な問題である場合は、両方の方法を試してみてください(実装はかなり簡単です)。または、優秀なProcess Explorerを使用してください。

編集:私が取り組んでいるアプリケーションの1つに約55Kのノードを含むノードツリーがあります。ツリー構造を構築するだけでなく、O(1)ルックアップの配列も維持します。再帰的なFindNodeByIDメソッドを使用しているときに得たO(m * n)よりもはるかに優れています。

+0

これは20000ノードを超えています。そのポインタのために80k。 –

+0

80k ... ??あなたはメグの10分の1以下を心配しています...?存在しない問題に重点を置いているように聞こえます。 –

+0

ストレスなく、興味があります。私はそれがきちんとした質問だと思った。 –

1

ポイント#1は、時期尚早のメモリ最適化です。 #2は早すぎるパフォーマンスの最適化です。メモリやCPUのボトルネックが問題を引き起こしているかどうかを判断するためにアプリケーションをプロファイリングしましたか?そうでない場合は、なぜユーザーに役立たない「最適化」のために、よりメンテナンス可能なデザインを犠牲にするのでしょうか?

#2と一緒に行くことを強くお勧めします。代わりに計算することができるものを保存するたびに、あなたがやっていることはキャッシングです。キャッシングは良いアイデアですが、メンテナンスの頭痛にもなります。 (たとえば、親を変更することによってあるツリーから別のツリーにノードを移動する場合、ルートフィールドを更新することも忘れてしまいますか?)必要がない場合はキャッシュしないでください。

0

TreeViewからクラスを派生させて、シングルトンの静的プロパティを追加できます。そうすれば、クラスの単一インスタンスを参照するグローバルフィールドを効果的に追加できますが、そのクラスにスコープされた名前空間であるという利点があります。

0

内部クラスの嫌悪感を無視して、Treeクラスを定義し、そのノードをInnerクラスとして定義することができます。各ノードは、ルートを含むツリーの状態にアクセスできます。

これは、Javaがノードをその親にどのように関連付けているかによって、#1と同じになることがあります。 (私は確信していないと私はそれをプロファイルする必要があります)

+0

私はこれが#1と同じであることはほぼ確信していますが、実際には実装できる方法はありません。 – Niall

2

パラメターとしてルートを渡すことが一般的に最適です。ツリーをナビゲートするためにある種のイテレータを使用している場合は、その代わりにルートへの参照を格納する方法もあります。

関連する問題