質問

ショートバージョン: 各ノードが複数の葉を持つことができる子供の多くのレベル(非バイナリ)の木(非バイナリ)では、ノードが与えられた特定の条件を満たす一定の条件を満たす最善の方法は何ですか?

Long、Conbolated Version: フォルダがあると言ってください。これにより、より多くのフォルダを含めることができます。生産では、私のシステムに最も深いフォルダが約15層になっています。各フォルダには文書がある場合があります。

ユーザーがフォルダに移動すると、そのフォルダにある文書の数を知る必要があります。彼らはまた、それらの文書のいくつかの文書が「フラグ付き」されているかを知る必要があります。特定の期間の後、それらは更新されていない場合、文書をフラグにフラグを立てることができます。これは履歴エントリに基づいて決定されます - フォルダの最後の履歴エントリをXより大きい場合はフラグが立てられます。

今、私はすべてのフォルダ>サブフォルダ>などを繰り返します>履歴エントリと集計再帰的にチェックします。これは今はかなり遅くなっていますので、新しいアプローチが必要です。

私は2つの選択肢を思い付きましたが、より良いアプローチがあるかどうか、またはこれらのうちどれが最善であるかどうかを知りたいです。

オプション1 :文書を追加するか文書を削除するときは、フォルダエンティティに保存されている「DocumentCount」プロパティをインクリメント/減分します。これは、追加/削除が最小限のパフォーマンスヒットを受けることを意味します。しかし、ここでの問題は、私が実際には文書の総数、および(履歴エントリをチェックすることによって)フラグが付けられている文書の総数を数える必要があるため、別のフィールドと別のプロセスが必要な場合があります。ステータスの変更これは、何かがフラグが付けられているかどうかをチェックするとさらに複雑さが紹介されています。プロパティではなくメソッド呼び出しです。

オプション2:システム内の各フォルダの "DocumentCount"と "UnopenedDocumentCount"プロパティを実行して更新し、多くのCPUサイクルのプロパティを更新し、無駄になるようです。

オプション3 :これを考えるだけで、すべての文書を繰り返すことができ、評価する前にターゲットノードの直接的または遠い子が再帰を介して繰り返されるよりも優れているかどうかを確認します。私はこのような気がしますが、木の中でハイアップするノードの方が良いでしょうが、低レベルのノードのためにすべての子供を繰り返すことはばかげているでしょう。 HMMM ...

オプション1を実装しています..他にどのようなオプションがありますか?

役に立ちましたか?

解決

ツリーにノードを追加すると、集計したい条件がわかっている場合は、ステップを押し下げるのではなく、ツリーを通過して再帰を縮小し、再帰と更新を巻き戻すように調整することができます。親ノードの集計。

同様に、ノードを更新するときに、あなたはそれらに再販されてから再帰を巻き込み、両親を更新します。

事前に条件がわからない場合は、ねじ込みます。あなたは理にかなっていかない順序で木を横断するのではありません。あなたが言ったことから、それはあなたがノードでやっていることは何でも左右のサブツリーのどんなサブツリーの関数であるかのように聞こえます。これは、郵便局の答えのように見えます。

注:上記があなたに理にかなっていない場合は、 vol。1

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top