アルゴリズムはgit bisectによって最適化されていますか?


8

してみましょう DAGなります。一部のノードは「不良」であり、その他は「良好」であることがわかっています。悪いノードの子孫は悪いが、良いノードの祖先は良い。また、不良ノードには一意の最小要素があり、タイプ「Are you good or bad?」のクエリでクエリするノードをできるだけ少なくしたいと考えています。GGG

この問題は、一般的なバージョン管理システムであるGitでコマンドによって解決されます。git-bisectこれは、プログラマーがバグが導入された最初のコミットを見つけるのに役立ちます。

最初に、Gitによって実装されたアルゴリズムは、1つの不良コミットと1つ以上の良好なコミットを知っていると想定しています。実行の各ステップで、アルゴリズムは次のステップ(ここから取得)を使用してコミットを見つけます。

  1. 次のコミットのみを保持します。

    a)不良コミットの祖先である(不良コミット自体を含む)、および

    b)グッドコミットの祖先ではない(グッドコミットを除く)。

  2. 結果のグラフの適切な端から始めて、各コミットに、その祖先の数にプラス1を関連付けます。

  3. 各コミットに関連付けるバツNバツ、ここでバツはステップ2でのコミットに関連付けられた値、Nはグラフ内のコミットの総数(ステップ1で削減された後)。

  4. 最良の二分ポイントは、関連付けられた数が最大のコミットです。

このアルゴリズムは基本的に、「最悪の場合」を実現するコミットを見つけています。実際、は、最良の場合の次の反復でのDAG内のノードの数なので、が最悪のケースです。バツNバツ最高バツNバツ

不思議なんだけど:

  • 「最悪のケース」、つまりを達成するノードを選択した場合、違いはありますか?minmax(X,NX)
  • このアルゴリズムは最悪の場合最適ですか?

編集:私はこの問題に限界があることに気づきました。と呼ばれる親を持つ単一のノードによって形成されるDAGを考えます。が不良であることがわかっている場合は、各親をチェックして、それらが最小の不良ノードであるかどうかを確認します。Ω(N)bN1g1,,gN1b

編集2:以前は実際には境界です。ここで、はposetの幅です。この問題の代替アルゴリズムは、クエリを使用するcstheory.stackexchangeのこの回答に記載されています。Ω(w)wO(wlogn


1
私たちが何を意味するかを最適に定義せずに、それが最適であるかどうかに答えることはできません。特に、最悪の場合の複雑さについて話していますか?平均的なケースの複雑さ?典型的なワークロードは何ですか?(典型的なグラフはどのように見えますか?グラフ上の分布は何ですか?)これらの質問は実際には非常に重要ですが、明確または単純な分析的回答がない場合があります。
DW

私は主に最悪の場合の複雑さに関心があります。貪欲なアルゴリズムが誤った選択をしすぎるインスタンスを作成しようとしましたが、実行できませんでした。もちろん、典型的なgitグラフには多くの構造があります(私は、ほとんどのコミットが存在する、長いブランチ(マスターブランチ)を期待しています)を特徴付けるのはおそらく難しいでしょう。
Jacopo Notarstefano 2014年

1
私はあなたが何を求めているのか本当に理解していませんが、次の不等式が役立つ場合があります:2つの変数関数の場合、常に。たとえば、math.stackexchange.com / a / 186722/3060fmaxxminyf(x,y)minxmaxyf(xy
Nick Algerを

回答:


5

とが行っていることの直感は次のとおりです。特定のコミットに焦点を当てる。をテストし、それを「良好」または「不良」のいずれかに分類するとします。テストするまで、それが良いか悪いかはわかりませんが、これらの2つのケースのそれぞれでグラフがどれだけ小さくなるかを事前に予測できます。特に、は、コミットが良好であることが判明した場合に削減されるコミットの数であり、は、コミットが不良であることが判明した場合に削減されるコミットの数です。バツNccバツcNバツc

したがって、値は、テストの結果がどうであれ、次のステップで取り除くことができるコミット数の下限です。Gitアルゴリズムのアイデアは、このメトリックを最大化することです。言い換えると、Gitは可能な限り大きいしきい値と次にテストするコミットを選択するため、Git は次のステップで少なくともコミットを削除できることを確認できます。バツNバツtct

各コミットが良いか悪いかについての情報がないので、それが良いか悪いかの可能性が高い場合、これはローカルに最適な選択のように見えます。したがって、Gitアルゴリズムは貪欲なアルゴリズムです。

Gitアルゴリズムはグローバルに最適ですか?それは、「最適」の定義、および(おそらく)実際に遭遇するDAGの分布に依存します。おそらく、実際に遭遇するDAGの確率分布の単純な特徴付けはないので、この問題の最適性の結果を見つけるのはおそらく難しいでしょう。


2
これは興味深い説明ですが、これは私の質問に対する回答ではないため、受け入れられません。
Jacopo Notarstefano 2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.