リーフノードは実際にはツリーではないため(各ノードは複数の子と複数の親を持つことができます)、実際にすべてのルートノードを見つけようとしているため、リーフノードがまだ適切な用語であるかどうかはわかりません(これは実際にはセマンティクスの問題です.すべてのエッジの方向を逆にすると、それらはリーフ ノードになります)。
現在、グラフ全体 (指定されたノードから到達可能) をトラバースしているだけですが、それはやや高価であることが判明したため、これを行うためのより良いアルゴリズムがあるかどうか疑問に思っています. 私が考えていることの 1 つは、(別のパスをたどっている間) 既にアクセスされたノードを追跡し、それらを再チェックしないことです。
他にアルゴリズムの最適化はありますか?
また、このノードが子孫であるルート ノードのリストを保持することも考えましたが、ノードが追加、移動、または変更されるたびに変更されるかどうかを確認する必要がある場合、そのようなリストを保持するのもかなりコストがかかるようです。削除されました。
編集:
これは、単一のノードを見つけるだけではなく、エンドポイントであるすべてのノードを見つけることです。
また、ノードのマスター リストもありません。各ノードには、その子と親のリストがあります。(まあ、それは完全に正しいわけではありませんが、事前に DB から数百万のノードをプルすると、非常にコストがかかり、OutOfMemory 例外が発生する可能性があります)
編集2:
可能な解決策を変更する場合と変更しない場合がありますが、グラフは、多くても数十のルート ノード (私が見つけようとしているもの) と数百万 (おそらく数千万または数億) のリーフ ノード (ここでから始めています)。