Algoritma
Yayın: 14 Temmuz 2026
7 dk okuma
Diff (Fark) Algoritması Nasıl Çalışır? LCS mantığı basitçe
Git'te git diff çalıştırdığınızda, Word'de "değişiklikleri izle" açtığınızda ya da bir online metin karşılaştırma aracı kullandığınızda, perde arkasında hep aynı temel fikir çalışır: en uzun ortak alt dizi (LCS). Bu yazıda bu fikri matematiğe boğmadan, küçük bir örnek üzerinden adım adım anlatıyoruz.
Diff algoritması nasıl çalışır?
Kısa cevap
Diff algoritması, iki metni en uzun ortak alt diziye (LCS) göre hizalar. Bu ortak dizi, iki metnin "değişmeyen iskeleti"dir. İskelet dışında kalıp sadece eski metinde olan parçalar silinen, sadece yeni metinde olan parçalar eklenen olarak işaretlenir. Sonuç, en az sayıda ekleme/silme içeren — dolayısıyla insan gözüyle en anlamlı — fark listesidir.
Bu, sıradan bir "hangi kelimeler farklı" karşılaştırmasından farklıdır: diff algoritması metinlerin sırasını da dikkate alır ve bir kelimenin yerinin değişip değişmediğini, yoksa gerçekten silinip yeniden mi yazıldığını ayırt edebilir. Kendi metinlerinizde deneyin: Metin Karşılaştırma aracını açın.
LCS: en uzun ortak alt dizi nedir?
Kısa cevap
En uzun ortak alt dizi (LCS), iki dizide sırası korunarak (ama bitişik olmasına gerek kalmadan) ortak bulunan en uzun elemanlar dizisidir. Diff bağlamında bu diziler kelime, satır veya karaktere bölünmüş metin parçalarıdır.
"Alt dizi" ile "alt küme" farkı nedir? Alt dizi (subsequence), orijinal sıralamayı korur ama araya başka elemanlar girebilir — bitişik olmak zorunda değildir. Örneğin "A-B-C-D" dizisinde "A-C" bir alt dizidir ama "A-C-B" değildir (sıra bozuk). Diff bu yüzden metnin orijinal sırasını koruyarak eşleşme arar; kelimeler yer değiştirse bile hangisinin "aynı kaldığını" doğru bulur.
LCS'yi bulduktan sonra diff algoritması şu basit kuralı uygular: LCS'de olmayan ama Metin A'da olan her parça silinen, LCS'de olmayan ama Metin B'de olan her parça eklenen'dir. LCS'nin kendisi ise değişmeyen (eşleşen) kısımdır.
Adım adım örnek: iki cümleyi hizalamak
Kısa cevap
"Bugün hava güzel" ile "Bugün hava çok güzel ve sıcak" cümlelerinin LCS'si "Bugün hava güzel"dir (bu üç kelime her iki metinde de aynı sırada geçer). LCS dışında kalan "çok" ve "ve sıcak" kelimeleri, sadece ikinci metinde olduğu için eklenen olarak işaretlenir.
Bu örneği kelime kelime takip edelim. Metin A: Bugün / hava / güzel. Metin B: Bugün / hava / çok / güzel / ve / sıcak.
Kelime bazlı hizalama sonucu
| Kelime | Metin A'da? | Metin B'de? | Sınıf |
| Bugün | ✓ | ✓ | eşleşen |
| hava | ✓ | ✓ | eşleşen |
| çok | — | ✓ | eklenen |
| güzel | ✓ | ✓ | eşleşen |
| ve | — | ✓ | eklenen |
| sıcak | — | ✓ | eklenen |
"Bugün", "hava", "güzel" LCS'nin parçasıdır — her iki metinde de aynı sırada geçer. Diğer üç kelime yalnızca B'de olduğu için eklenen sayılır.
Şimdi tersini deneyelim: Metin A "Bugün hava sıcak ve güzel", Metin B "Bugün hava güzel" olsun. Bu sefer LCS yine "Bugün hava güzel"dir ama "sıcak ve" kelimeleri bu kez sadece A'da olduğu için silinen olarak işaretlenir. Aynı üç kelime hem eklenen hem silinen örneğinde LCS'nin değişmez çekirdeği olarak kaldı — bu, algoritmanın en kritik özelliğidir: ortak kısmı bulmak, farkı otomatik olarak geriye kalan olarak tanımlar.
Benzersiz içgörü
Bir kelime hem eski hem yeni metinde geçse bile, eğer sırası LCS'ye uymuyorsa (örneğin metnin başka bir yerine taşınmışsa) algoritma onu "eşleşen" değil "silinen + eklenen" çifti olarak gösterebilir. Bu yüzden bazı diff çıktılarında aynı kelimenin bir yerde kırmızı, başka bir yerde yeşil göründüğünü fark edebilirsiniz — bu bir hata değil, LCS'nin sıra kısıtının doğal sonucudur.
LCS mantığını kendi metninizde görün
İki metni yapıştırın, hangi kelimelerin "eşleşen iskelet", hangilerinin eklenen/silinen olduğunu anında görün.
Metin Karşılaştırıcıyı Aç →
Tanecik boyutu: kelime mi, satır mı, karakter mi?
Kısa cevap
LCS algoritması aynıdır; değişen tek şey metnin hangi birimlere (kelime, satır veya karakter) bölündüğüdür. Tanecik ne kadar küçükse (karakter), sonuç o kadar ayrıntılı ama o kadar "gürültülü" olur; tanecik büyüdükçe (satır) sonuç daha kaba ama daha okunaklı olur.
Git'in varsayılan git diff davranışı satır bazlıdır çünkü kaynak kod satır satır düzenlenir. Ama Git'in --word-diff seçeneği aynı LCS mantığını kelime düzeyinde çalıştırır — tıpkı bu sitenin kelime modunun yaptığı gibi. Hangi taneciğin seçileceği, LCS'nin matematiğini değil, sonucun okunabilirliğini etkiler.
Diff neden "en kısa" farkı arar?
Kısa cevap
İki metin arasında teknik olarak birden fazla geçerli hizalama olabilir, ama en az sayıda ekleme/silme içeren hizalama insan gözüyle en anlamlı olanıdır. LCS'yi maksimize etmek, otomatik olarak eklenen+silinen sayısını minimize eder.
Örneğin tamamen alakasız iki cümleyi ortak harfler üzerinden "hizalamak" teknik olarak mümkündür ama anlamsızdır. LCS algoritması, ortak alt diziyi mümkün olan en uzun haliyle ararken, gereksiz yere parçalanmış eşleşmeler yerine bütünlüklü, anlamlı bloklar bulmaya çalışır. Bu, Myers algoritması gibi optimize edilmiş diff varyantlarının (Git'in temelinde) da hedeflediği şeydir: minimum düzenleme mesafesi (edit distance).
Peki çok büyük metinlerde bu nasıl hızlı çalışır?
Saf LCS hesaplaması teorik olarak metnin uzunluklarının çarpımıyla orantılı zaman alabilir. Pratikte diff araçları önce metinlerin ortak baş ve son kısımlarını otomatik olarak kırpar (çoğu belgenin başı ve sonu değişmeden kalır), sonra yalnızca gerçekten farklı olan orta kısımda LCS hesaplar. Bu optimizasyon, binlerce satırlık dosyaların bile tarayıcıda anında karşılaştırılabilmesini sağlar.
Sık sorulan sorular
Diff algoritması nedir?
İki metin veya dosya arasındaki farkları bulan yöntemdir. En yaygın yaklaşım, iki diziyi en uzun ortak alt diziye (LCS) göre hizalamak; ortak olmayan kısımları eklenen ve silinen olarak işaretlemektir.
LCS (en uzun ortak alt dizi) nedir?
İki dizide sırası korunarak ortak bulunan en uzun alt diziyi bulan algoritmadır. Diff işleminde bu, iki metnin değişmeyen iskeletini oluşturur.
Diff algoritması neden en kısa farkı bulmaya çalışır?
En az sayıda ekleme/silme içeren fark listesi insan gözüyle en anlamlı olandır. LCS'yi maksimize etmek otomatik olarak bunu sağlar.
Git diff ile bu araç aynı algoritmayı mı kullanır?
Temel fikir (LCS tabanlı hizalama) aynıdır. Git varsayılan olarak satır bazlı Myers algoritmasını kullanır; bu site kelime, satır ve karakter düzeyinde seçilebilir bir LCS diff kullanır.
Metodoloji & kaynaklar. Bu yazıdaki örnekler, MetinDiff'in tarayıcı içi çalışan LCS tabanlı diff motoruyla üretilmiştir. Kaynak: klasik en uzun ortak alt dizi (LCS) algoritması ve türevleri (ör. Myers diff). Son güncelleme: 14 Temmuz 2026. Yazı bilgilendirme amaçlıdır.