Saya sudah tampak gila untuk penjelasan tentang algoritma diff yang bekerja dan efisien.
Yang paling dekat yang saya dapatkan adalah tautan ini ke RFC 3284 (dari beberapa posting blog Eric Sink), yang menjelaskan secara termudah dimengerti format data di mana hasil yang berbeda disimpan. Namun, tidak disebutkan sama sekali tentang bagaimana suatu program akan mencapai hasil ini saat melakukan perbedaan.
Saya mencoba untuk meneliti ini karena keingintahuan pribadi, karena saya yakin pasti ada kompromi ketika menerapkan algoritma diff, yang kadang-kadang cukup jelas ketika Anda melihat diffs dan bertanya-tanya "mengapa program diff memilih ini sebagai perubahan bukannya itu? "...
Di mana saya dapat menemukan deskripsi algoritma yang efisien yang pada akhirnya menghasilkan VCDIFF?
Omong-omong, jika Anda menemukan deskripsi algoritma aktual yang digunakan oleh SourceGear's DiffMerge, itu akan lebih baik.
CATATAN: urutan umum terpanjang tampaknya bukan algoritma yang digunakan oleh VCDIFF, sepertinya mereka melakukan sesuatu yang lebih cerdas, mengingat format data yang mereka gunakan.
Jawaban:
Algoritma Perbedaan O (ND) dan Variasi-nya adalah makalah yang fantastis dan Anda mungkin ingin memulainya. Ini termasuk pseudo-code dan visualisasi yang bagus dari grafik traversal yang terlibat dalam melakukan diff.
Bagian 4 dari makalah ini memperkenalkan beberapa penyempurnaan pada algoritma yang membuatnya sangat efektif.
Berhasil menerapkan ini akan meninggalkan Anda dengan alat yang sangat berguna di kotak alat Anda (dan mungkin beberapa pengalaman yang sangat baik juga).
Menghasilkan format output yang Anda butuhkan kadang-kadang bisa rumit, tetapi jika Anda memiliki pemahaman tentang algoritma internal, maka Anda harus dapat menampilkan apa pun yang Anda butuhkan. Anda juga dapat memperkenalkan heuristik untuk mempengaruhi output dan melakukan pengorbanan tertentu.
Berikut adalah halaman yang menyertakan sedikit dokumentasi, kode sumber lengkap , dan contoh-contoh algoritma diff menggunakan teknik-teknik dalam algoritma yang disebutkan di atas.
The kode sumber tampaknya mengikuti algoritma dasar dekat dan mudah dibaca.
Ada juga sedikit persiapan input, yang menurut Anda berguna. Ada perbedaan besar dalam output ketika Anda berbeda berdasarkan karakter atau token (kata).
Semoga berhasil!
sumber
diff
kertas Unix oleh Hunt dan McIlroy.Saya akan mulai dengan melihat kode sumber aktual untuk diff, yang disediakan oleh GNU .
Untuk pemahaman tentang bagaimana kode sumber itu benar-benar bekerja, dokumen dalam paket itu merujuk makalah yang menginspirasi itu:
Membaca makalah kemudian melihat kode sumber untuk implementasi harus lebih dari cukup untuk memahami cara kerjanya.
sumber
Lihat https://github.com/google/diff-match-patch
Juga lihat halaman wikipedia.org Diff dan - " Bram Cohen: Masalah diff telah dipecahkan "
sumber
Saya datang ke sini mencari algoritma diff dan kemudian membuat implementasi sendiri. Maaf saya tidak tahu tentang vcdiff.
Wikipedia : Dari urutan umum terpanjang, hanya langkah kecil untuk mendapatkan keluaran seperti-berbeda: jika item tidak ada di bagian berikutnya tetapi ada dalam aslinya, item itu pasti sudah dihapus. (Tanda '-', di bawah.) Jika tidak ada di urutan berikutnya tetapi ada di urutan kedua, harus ditambahkan di. (Tanda '+'.)
Animasi yang bagus dari algoritma LCS di sini .
Tautan ke implementasi ruby LCS cepat di sini .
Adaptasi ruby saya yang lambat dan sederhana ada di bawah ini.
sumber
Berdasarkan tautan yang diberikan Emmelaich, ada juga sejumlah besar Diff Strategies di situs web Neil Fraser (salah satu penulis perpustakaan) .
Dia membahas strategi dasar dan menjelang akhir artikel berlanjut ke algoritma Myer dan beberapa teori grafik.
sumber