Apakah algoritma yang diterapkan oleh git bisect optimal?

8

Biarkan menjadi DAG. Kita tahu bahwa beberapa node dalam adalah "buruk", sementara yang lain "baik"; keturunan dari simpul buruk adalah buruk sedangkan nenek moyang dari simpul baik adalah baik. Kita juga tahu bahwa node buruk memiliki elemen minimal unik di yang ingin kami tanyakan sesedikit mungkin node dengan pertanyaan dari tipe "Apakah Anda baik atau buruk?".GGG

Masalah ini diselesaikan di Git, sistem kontrol versi populer, dengan perintah git-bisect, yang membantu programmer menemukan komit pertama di mana bug diperkenalkan.

Pada awalnya, algoritma yang diterapkan oleh Git mengasumsikan mengetahui satu komit buruk dan satu atau lebih komit baik. Pada setiap langkah eksekusi, algoritme menemukan komit menggunakan langkah-langkah berikut (diambil dari sini ):

  1. Pertahankan hanya komitmen yang:

    a) adalah leluhur dari komit buruk (termasuk komit buruk itu sendiri), dan

    b) bukan nenek moyang dari komitmen yang baik (tidak termasuk komitmen yang baik).

  2. Mulai dari ujung yang bagus dari grafik yang dihasilkan, kaitkan untuk setiap komit dengan jumlah leluhur yang dimilikinya ditambah satu.

  3. Kaitkan ke setiap komit , di mana X adalah nilai yang terkait dengan komit di langkah 2, dan N adalah jumlah total komit dalam grafik (setelah dikurangi di langkah 1).min(X,NX)XN

  4. Titik pembelahan terbaik adalah komit dengan angka terkait tertinggi.

Algoritma ini pada dasarnya menemukan komit yang mencapai "kasus terbaik terburuk": pada kenyataannya, adalah jumlah node dalam DAG pada iterasi berikutnya dalam kasus terbaik, dengan demikian adalah kasus terbaik terburuk.min(X,NX)maxmin(X,NX)

Aku bertanya-tanya:

  • Apakah ada bedanya jika kita memilih "case terburuk terbaik", yaitu node yang mencapai ?minmax(X,NX)
  • Apakah algoritme terburuk ini optimal?

EDIT: Saya perhatikan bahwa masalah ini memiliki ikatan . Pertimbangkan DAG yang dibentuk oleh satu simpul dengan orang tua yang disebut . Jika kita tahu bahwa buruk maka kita harus memeriksa setiap orang tua untuk melihat apakah mereka adalah simpul buruk minimal.Ω(N)bN-1g1,...,gN-1b

EDIT 2: Yang sebelumnya sebenarnya terikat dengan , di mana adalah lebar poset. Algoritme alternatif untuk masalah ini diberikan dalam jawaban ini di cstheory.stackexchange yang menggunakan kueri .Ω(w)wHAI(wcatatann)

Jacopo Notarstefano
sumber
1
Kami tidak dapat menjawab apakah itu optimal tanpa mendefinisikan apa yang kami maksud dengan optimal. Secara khusus, apakah kita berbicara tentang kompleksitas kasus terburuk? Kompleksitas kasus rata-rata? Berapa beban kerja tipikal? (Seperti apa bentuk grafik? Apa distribusi pada grafik?) Pertanyaan-pertanyaan itu sangat penting dalam praktiknya, tetapi mungkin tidak memiliki jawaban analitik yang bersih atau sederhana.
DW
Saya sebagian besar tertarik pada kompleksitas kasus terburuk. Saya mencoba membuat contoh di mana algoritma serakah mengambil terlalu banyak pilihan yang salah, tetapi tidak dapat melakukannya. Tentu saja, grafik git tipikal memiliki banyak struktur (saya harapkan rantai panjang di mana kebanyakan komit terletak: cabang master), tetapi mungkin terlalu sulit untuk dikarakterisasi.
Jacopo Notarstefano
1
Saya tidak benar-benar mengerti apa yang Anda tanyakan, tetapi ketidaksetaraan berikut mungkin berguna: Untuk setiap fungsi dari dua variabel , selalu merupakan kasus yang . Lihat misalnya, math.stackexchange.com/a/186722/3060fmaksxminyf(x,y)minxmaksyf(x,y)
Nick Alger

Jawaban:

5

Inilah beberapa intuisi untuk apa yang dan lakukan. Fokus pada komitmen tertentu . Misalkan kita menguji dan mengklasifikasikannya sebagai "baik" atau "buruk". Sampai kami mengujinya, kami tidak tahu apakah itu baik atau buruk, tetapi kami dapat memperkirakan sebelumnya berapa banyak grafik yang akan diperoleh di masing-masing dari dua kasus tersebut. Secara khusus, adalah jumlah komit yang akan dipangkas jika komit ternyata baik, dan adalah jumlah komit yang akan dipangkas jika komit ternyata buruk.XNccXcN-Xc

Oleh karena itu, nilai adalah batas yang lebih rendah pada jumlah komit yang akan dapat kami pangkas pada langkah berikutnya, tidak peduli bagaimana pengujiannya. Gagasan algoritma Git adalah untuk memaksimalkan metrik ini. Dengan kata lain, Git memilih ambang yang sebesar mungkin, dan komit untuk menguji selanjutnya, sehingga Git dapat memastikan bahwa ia akan dapat memangkas setidaknya berkomitmen pada langkah berikutnya.min(X,N-X)tct

Jika kami tidak memiliki informasi tentang apakah setiap komit cenderung menghasilkan baik atau buruk, jadi kemungkinan besar itu baik atau buruk, maka ini terlihat seperti pilihan yang optimal secara lokal. Dengan demikian, algoritma Git adalah algoritma serakah.

Apakah algoritma Git optimal secara global? Itu akan tergantung pada definisi "optimal", dan (mungkin) pada distribusi DAG satu pertemuan dalam praktek. Mungkin tidak ada karakterisasi sederhana dari distribusi probabilitas pada DAG yang dijumpai dalam praktek, jadi saya berharap mungkin akan sulit untuk menemukan hasil optimal untuk masalah ini.

DW
sumber
2
Walaupun ini adalah penjelasan yang menarik, ini bukan jawaban untuk pertanyaan saya, jadi saya tidak bisa menerimanya.
Jacopo Notarstefano