もちろん、問題は二重カウントです。特定のクラスのDAG =ツリー、またはシリアル/パラレルツリーでさえも簡単に実行できます。妥当な時間で一般的なDAGで機能する唯一のアルゴリズムは近似アルゴリズム(Synopsis拡散)ですが、その精度の向上はビット数で指数関数的です(そして多くのビットが必要です)。
背景:このタスクは、BBChop(http://github.com/ealdwulf/bbchop)の確率計算の一部として、断続的なバグを見つけるためのプログラム(つまり、「ベイズバージョン」 git bisect ')。したがって、問題のDAGは改訂履歴です。つまり、エッジの数がノードの数の2乗に近づく可能性は低く、小さなkの場合、ノードの数のk倍未満になる可能性が高いことを意味します。残念ながら、リビジョンDAGの他の有用なプロパティは見つかりませんでした。たとえば、最大のトライコネクテッドコンポーネントがノード数の平方根としてのみ成長することを期待していましたが、悲しいことに(少なくともLinuxカーネルの歴史では)線形に成長します。