2 puan yazan GN⁺ 2024-01-15 | 1 yorum | WhatsApp'ta paylaş

Dinamik programlama sihir değildir

  • Dinamik programlama, karmaşık problemleri çözmek için kullanılan; onları daha küçük problemlere bölerek yaklaşan bir tekniktir.
  • Bu teknik doğaldır ve yaygın birçok algoritma, belirli problemlere dinamik programlamanın uygulanmış hâlidir.
  • Dinamik programlamanın anlaşılmasına yardımcı olmak için daha kolay bir giriş ve ayrıntılı açıklama sunuluyor.

Yakınma

  • Yazılım mühendisliği, adlandırma konusunda çoğu zaman berbattır.
  • 'Bootstrap', 'daemon', 'Cascading Style Sheets', 'cookie', 'yapay zeka' gibi terimler belirsiz ya da yanıltıcı olabilir.
  • 'Dinamik programlama' terimi de kendi başına 'dinamik' olmakla ilgili değildir; aslında algoritma tasarımında kullanılan bir fikirdir.

Temel önbellekleme

  • Bir problemi daha küçük ve benzer problemlere ayırarak çözmeye çalıştığınızda, aynı küçük problemleri birden çok kez çözmeniz gerekebilir.
  • Fibonacci dizisi örneğinde, bunu basit bir özyinelemeli fonksiyonla uygularsanız aynı hesaplamaları tekrar tekrar yaparsınız.
  • Sonuçları önbelleğe alarak (veya memoization kullanarak) yinelenen hesaplamalardan kaçınabilirsiniz.

Optimize edilmiş önbellekleme

  • Memoization kullanırsanız özyinelemeyi korur, ancak gereken şeyleri gerektiği anda hesaplarsınız.
  • Bunun yerine, ihtiyaç duyacağınız her şeyi önceden hesaplayan bir yaklaşımla ilerleyebilirsiniz.
  • Bu yöntem problemi özyinelemeli çağrılar olmadan çözer; işte buna dinamik programlama denir.

Edit distance

  • İki dize arasındaki edit distance, bir diziyi diğerine dönüştürmek için gereken en az düzenleme sayısıdır.
  • Edit distance; karakter değiştirme, ekleme ve silmeyi kapsayacak şekilde hesaplanabilir ve bu problem dinamik programlama ile verimli biçimde çözülebilir.
  • Küçük problemlerin çözümlerinden genel çözümü nasıl türeteceğinizi bulmanız gerekir.

Advent of Code, Day 12

  • 12 Aralık 2023 tarihli Advent of Code probleminde 1D nonogram çözmeniz gerekir.
  • Bunu brute-force yaklaşımla çözmek mümkündür, ancak üstel karmaşıklığa sahiptir.
  • Bunun yerine dinamik programlama uygulanarak verimli bir çözüm elde edilebilir.

Sonuç

  • Dinamik programlama kolay değildir, ancak çoğu programcı için ulaşılamaz bir şey de değildir.
  • Bir problemi küçük problemlere nasıl böleceğinizi anladığınızda, memoization'ı çeşitli durumlarda kullanabilir ve saf bir uygulamaya göre büyük iyileştirmeler elde edebilirsiniz.
  • Dinamik programlamada ustalaşmak, tüm bir algoritma sınıfını anlamayı, trade-off'ları daha iyi kavramayı ve başka optimizasyonları mümkün kılmayı sağlar.

GN⁺ görüşü

  • Dinamik programlama, karmaşık problemleri verimli biçimde çözmek için önemli bir tekniktir; özyinelemeli yaklaşım yerine küçük problemlerin çözümlerini önbelleğe alarak yinelenen hesaplamaları azaltır ve performansı ciddi biçimde artırabilir.
  • Bu yazı, dinamik programlamanın temel kavramlarını anlamak isteyen başlangıç seviyesindeki yazılım mühendisleri için oldukça faydalıdır.
  • Fibonacci dizisi ve edit distance örnekleri, dinamik programlama kavramını anlamaya yardımcı olur ve bunu gerçek problem çözümüne uygulamak için iyi bir başlangıç noktası sunar.

1 yorum

 
GN⁺ 2024-01-15
Hacker News görüşleri
  • Yazının dinamik programlama (DP) algoritmalarını özyinelemenin önbelleğe alınması olarak açıklaması iyi bir nokta.

    • Özyinelemeli bir çözüm bulmak, DP çözümü bulmaya başlamak için en iyi başlangıç noktası.
    • Özyinelemeli çözümü memoization ile desteklemek, hızı ciddi ölçüde artırabilir.
    • Önemli olan, çağrı ağacında çok sayıda alt problem olması değil, görece az sayıda benzersiz alt problem bulunması.
  • Yazının önce problemi özyinelemeli olarak ele alıp sonra kademeli olarak önbellekleme eklemesini ve ardından bunu gereken önbellek boyutuna kadar küçültmesini beğeniyorum.

    • Doğrudan bir dinamik programlama çözümü bulmaya çalışırken tıkandığım veya büyük çaba harcamam gereken deneyimlerim oldu.
    • Bundan sonra kendimi adım adım bu sırayla ilerlemeye zorlayacağım.
  • Dinamik programlamanın harika uygulamalarından biri, nükleik asit/protein dizilerinin ikili hizalanmasıdır.

  • Son derece iyi bir algoritma profesörüyle ilgili bir deneyim paylaşılıyor.

    • Profesör UCLA'de okumuştu ve dinamik programlama dersi olağanüstüydü.
    • Basit ama üstel karmaşıklığa sahip bir problemle başlayıp, problemi daha küçük parçalara ayırarak karmaşıklığı polinomsal düzeye indiriyor, ardından memoization uygulayarak bunu doğrusal karmaşıklığa düşürüyordu.
    • Kullanılan problemleri hatırlamak isterdim.
  • Dynamic Programming is not Black Magic yazısına bir bağlantı paylaşılıyor.

    • Yazıya yoğun trafik nedeniyle erişmek zorlaşmış (hug of death).
  • Programlamayı büyük ölçüde kendi kendine öğrenmiş biri, iş ararken mülakatta dinamik programlama kullan denilseydi bunu bilmeyeceğini söylüyor.

    • Neyse ki böyle bir şey olmadı ve bu tekniği bildiği için birkaç mülakatta kullanabildi.
  • "Dinamik programlama" adı, sanki programlama alanından çıkmamış gibi görünebilir.

    • Aslında optimizasyonla ilgilidir ve ayrık zamanda karar problemlerini çözme yöntemidir.
    • Dinamik programlama, değer fonksiyonu V* tanımlayarak optimizasyon probleminin boyutunu büyük ölçüde azaltan bir yöntemdir.
  • "Dinamik programlama" dendiğinde yalnızca "memoization" düşünmenin yanlış olup olmadığı soruluyor.

    • Memoization'ı etkili kullanmak için problemi akıllıca bölmek, eksik kalan parça olabilir.
  • Dinamik programlama kara büyü değil; asıl zor olan, bir şeyin dinamik olarak programlanabileceğini göstermek ve doğruluğunu kanıtlamaktır.

    • Greedy algoritmalarda olduğu gibi, matematiksel tümevarım kullanarak resmî bir ispat gerekir.
  • Dinamik programlamada ustalaşmak için DPV algoritma kitabı ve Georgia Tech'in Udacity dersleri öneriliyor.

    • Problem çözme alıştırmaları yaparak dinamik programlama öğrenilebilir.