Böl ve Al Congo ve Dinamik Programlama arasındaki fark


140

Böl ve Conquer Algoritmaları ile Dinamik Programlama Algoritmaları arasındaki fark nedir? İki terim nasıl farklı? Aralarındaki farkı anlamıyorum.

Lütfen ikisi arasındaki farkları ve hangi zeminde benzer olduklarını açıklamak için basit bir örnek alın.

Yanıtlar:


156

Böl ve fethet

Divide and Conquer, problemi alt problemlere bölerek, her bir alt problemi özyinelemeli olarak ele geçirir ve bu çözümleri birleştirir.

Dinamik program

Dinamik Programlama, çakışan alt problemlerle ilgili problemleri çözmek için bir tekniktir. Her alt sorun yalnızca bir kez çözülür ve her alt sorunun sonucu gelecekteki referanslar için bir tabloda (genellikle bir dizi veya karma tablosu olarak uygulanır) saklanır. Bu alt çözeltiler, orijinal çözeltiyi elde etmek için kullanılabilir ve alt problemli çözeltileri saklama tekniği, hafızaya alma olarak bilinir.

Düşünebilirsin DP = recursion + re-use

Farkı anlamak için klasik bir örnek, nci fibonacci sayısının elde edilmesine yönelik her iki yaklaşımı da görmek olacaktır. Bu malzemeyi MIT'den kontrol edin .


Böl ve Fethet yaklaşımı Böl ve Fethet yaklaşımı

Dinamik Programlama Yaklaşımı resim açıklamasını buraya girin


9
görüntüleri nasıl yaptın? fare mi kullanıyorsunuz?
Vihaan Verma

34
Bu cevabın en önemli satırının bence: "örtüşen alt problemler". DP'de var, Böl ve Conquer yok
Hasan Iqbal

@HasanIqbalAnik Çakışan alt sorun, tekrar tekrar ortaya çıkan bir sorun anlamına gelir. Yukarıda gösterilen örnekte fn-2'yi çözmek gibi. D & C'de var ve bu yüzden DP kadar verimli değil.
Meena Chaudhary

1
Garip! 'Çakışan alt problemler' sorundan bahsediyorsunuz ama 'dinamik programlama' bir tür algoritma. Bence 'problemleri' ve 'algoritmaları' ayırt etmek önemlidir.
ZHU

Evet, DP, Bölme ve Conquer'e göre avantaj elde etmek için çakışan bölümleri not eder.
imagineerThat

25

Böl ve fethet ve dinamik programlama arasındaki diğer fark şunlar olabilir:

Böl ve fethet:

  1. Alt problemler üzerinde daha fazla çalışma yapar ve bu nedenle daha fazla zaman tüketir.
  2. Böl ve fethetmede alt problemler birbirinden bağımsızdır.

Dinamik program:

  1. Alt problemleri sadece bir kez çözer ve sonra tabloda saklar.
  2. Dinamik programlamada alt problem bağımsız değildir.

Böl ve fethet algoritmaları mutlaka DP alternatiflerinden daha fazla iş yapmaz. Bir örnek, Erickson'un maksimum aritmetik ilerleme bulma algoritmasıdır.
Michael Foukarakis

17

bazen özyinelemeli olarak programlama yaparken, aynı parametrelerle fonksiyonu birden çok kez çağırırsınız, bu da gereksizdir.

Ünlü örnek Fibonacci sayıları:

           index: 1,2,3,4,5,6...
Fibonacci number: 1,1,2,3,5,8...

function F(n) {
    if (n < 3)
        return 1
    else
        return F(n-1) + F(n-2)
}

Hadi F (5):

F(5) = F(4) + F(3)
     = {F(3)+F(2)} + {F(2)+F(1)}
     = {[F(2)+F(1)]+1} + {1+1}
     = 1+1+1+1+1

Bu yüzden aradık: 1 kez F (4) 2 kez F (3) 3 kez F (2) 2 kez F (1)

Dinamik Programlama yaklaşımı: Aynı parametreye sahip bir işlevi bir kereden fazla çağırırsanız, bir dahaki sefere doğrudan erişmek için sonucu bir değişkene kaydedin. Yinelemeli yol:

if (n==1 || n==2)
    return 1
else
    f1=1, f2=1
    for i=3 to n
         f = f1 + f2
         f1 = f2
         f2 = f

Tekrar F (5) 'i arayalım:

fibo1 = 1
fibo2 = 1 
fibo3 = (fibo1 + fibo2) = 1 + 1 = 2
fibo4 = (fibo2 + fibo3) = 1 + 2 = 3
fibo5 = (fibo3 + fibo4) = 2 + 3 = 5

Gördüğünüz gibi, birden fazla çağrıya ihtiyacınız olduğunda, değeri yeniden hesaplamak yerine karşılık gelen değişkene erişirsiniz.

Bu arada, dinamik programlama yinelemeli bir kodu yinelemeli bir koda dönüştürmek anlamına gelmez. Özyinelemeli bir kod istiyorsanız, alt sonuçları bir değişkene de kaydedebilirsiniz. Bu durumda tekniğe notlama denir. Örneğimiz için şöyle görünüyor:

// declare and initialize a dictionary
var dict = new Dictionary<int,int>();
for i=1 to n
    dict[i] = -1

function F(n) {
    if (n < 3)
        return 1
    else
    {
        if (dict[n] == -1)
            dict[n] = F(n-1) + F(n-2)

        return dict[n]                
    }
}

Divide and Conquer ile olan ilişki, D&D algoritmalarının özyinelemeye dayanmasıdır. Ve bazı sürümlerinde bu "aynı parametre sorunu ile çok işlevli çağrı" var. D&D algo'nun T (n) 'sini iyileştirmek için DP'nin gerekli olduğu bu tür örnekler için "matris zinciri çarpımı" ve "en uzun ortak alt diziyi" arayın.


17

Dinamik Programlama ve Böl ve Conqu Benzerlikleri

Şimdilik gördüğüm gibi, dinamik programlamanın bölün ve fethet paradigmasının bir uzantısı olduğunu söyleyebilirim .

Onlara tamamen farklı bir şeymiş gibi davranmam. Çünkü her ikisi de, bir sorunu doğrudan veya çözülecek kadar basit hale gelinceye kadar aynı ya da ilgili türdeki iki ya da daha fazla alt soruna tekrar tekrar bölerek çalışırlar . Daha sonra alt problemlerin çözümleri birleştirilerek orijinal probleme bir çözüm elde edilir.

Öyleyse neden hala farklı paradigma isimlerimiz var ve neden dinamik programlamayı bir uzantı olarak adlandırdım. Bunun nedeni, dinamik programlama yaklaşımının soruna ancak sorunun belirli kısıtlamaları veya önkoşulları olması durumunda uygulanabilmesidir . Ve bundan sonra dinamik programlama, bölme ve fethetme yaklaşımını notlama veya tablolama tekniği ile genişletir .

Adım adım gidelim…

Dinamik Programlama Önkoşulları / Kısıtlamaları

Az önce keşfettiğimiz gibi, dinamik programlamanın uygulanabilmesi için bölme ve ele geçirme sorununun sahip olması gereken iki temel özellik vardır:

  • Optimal altyapı  - alt problemlerinin optimum çözümlerinden optimum çözüm oluşturulabilir

  • Çakışan alt problemler  - problem, birkaç kez yeniden kullanılan alt problemlere ayrılabilir veya problem için yinelenen bir algoritma, her zaman yeni alt problemler üretmek yerine aynı alt problemi tekrar tekrar çözer

Bu iki koşul gerçekleştiğinde, bu bölme ve fethetme sorununun dinamik programlama yaklaşımı kullanılarak çözülebileceğini söyleyebiliriz.

Divide ve Conquer için Dinamik Programlama Uzantısı

Dinamik programlama yaklaşımı, bölme ve fethetme yaklaşımını, performansı önemli ölçüde artırabilecek alt sorun çözümlerini depolama ve yeniden kullanma amacına sahip iki teknikle ( notlama ve tablolama ) genişletir . Örneğin, Fibonacci fonksiyonunun saf özyinelemeli uygulaması, O(2^n)DP çözümünün sadece O(n)zamanla aynı şeyi yaptığı zaman karmaşıklığına sahiptir .

Memoization (yukarıdan aşağıya önbellek doldurma) , önceden hesaplanmış sonuçların önbelleğe alınması ve yeniden kullanılması tekniğini ifade eder. Kaydedilen fibişlev bu şekilde şöyle görünecektir:

memFib(n) {
    if (mem[n] is undefined)
        if (n < 2) result = n
        else result = memFib(n-2) + memFib(n-1)

        mem[n] = result
    return mem[n]
}

Tablolama (aşağıdan yukarıya önbellek doldurma) benzerdir ancak önbellek girişlerini doldurmaya odaklanır. Önbellekteki değerleri hesaplamak en kolay şekilde yinelemeli olarak yapılır. Tablolama sürümü fibşöyle görünecektir:

tabFib(n) {
    mem[0] = 0
    mem[1] = 1
    for i = 2...n
        mem[i] = mem[i-2] + mem[i-1]
    return mem[n]
}

Not alma ve tablo karşılaştırma hakkında daha fazla bilgiyi buradan edinebilirsiniz .

Burada kavramanız gereken ana fikir, bölme ve fethetme sorunumuzun çakışan alt problemlere sahip olması, alt problem çözümlerinin önbelleğe alınmasının mümkün hale gelmesi ve böylece not / tablonun sahneye çıkmasıdır.

Sonuçta DP ve DC Arasındaki Fark Nedir

Artık DP önkoşullarını ve metodolojilerini bildiğimiz için yukarıda belirtilenlerin tümünü tek bir resme koymaya hazırız.

Dinamik Programlama ve Bölme ve Conquer

Kod örneklerini görmek istiyorsanız, burada iki algoritma örneği bulacağınız daha ayrıntılı açıklamaya göz atabilirsiniz : DP ve DC arasındaki farkı gösteren İkili Arama ve Minimum Düzenleme Mesafesi (Levenshtein Mesafesi).


1
Offtopic: Bunu çizmek için bir grafik tablet kullandınız mı?
Geon George

1
@GeonGeorge no, çizim kalemle yapıldı ve sonra tarandı
Oleksii Trekhleb


8

Bu konuda Wikipedia'yı ve diğer akademik kaynakları zaten okuduğunuzu varsayıyorum, bu yüzden bu bilgileri geri dönüştürmeyeceğim. Ayrıca hiçbir şekilde bir bilgisayar bilimi uzmanı olmadığımı da söylemeliyim, ancak iki sentimi bu konuları anladığım konusunda paylaşacağım ...

Dinamik program

Sorunu ayrık alt problemlere böler. Fibonacci dizisi için özyinelemeli algoritma Dinamik Programlamaya bir örnektir, çünkü fib (n) için önce fib (n-1) için çözerek çözer. Orijinal problemi çözmek için farklı bir problem çözer .

Böl ve fethet

Bu algoritmalar tipik olarak sorunun benzer parçalarını çözer ve sonunda onları bir araya getirir. Mergesort, bölünme ve fethetmenin klasik bir örneğidir. Bu örnek ve Fibonacci örneği arasındaki temel fark, bir birleşmede, bölünmenin (teorik olarak) keyfi olabilmesidir ve nasıl dilimlediğinize bakılmaksızın, hala birleştiriyor ve sıralıyorsunuz. Diziyi nasıl böldüğünüz önemli değil, diziyi birleştirmek için aynı miktarda yapılmalıdır. Fib (52) için çözme, fib (2) için çözmekten daha fazla adım gerektirir .


5

Ben Divide & Conquerözyinelemeli bir yaklaşım ve Dynamic Programmingtablo doldurma olarak düşünüyorum .

Örneğin Merge Sort, bir Divide & Conqueralgoritmadır, her adımda olduğu gibi, diziyi iki yarıya böldünüz, iki yarıyı tekrar tekrar çağırır Merge Sortve birleştirirsiniz.

KnapsackDynamic Programminggenel sırt çantasının alt sorunlarına en uygun çözümleri temsil eden bir tabloyu doldururken bir algoritmadır. Tablodaki her bir giriş, 1-j maddelerinde verilen ağırlıkça bir torbada taşıyabileceğiniz maksimum değere karşılık gelir.


1
Bu birçok durum için geçerli olsa da, alt sorunların sonuçlarını bir tabloda sakladığımız her zaman doğru değildir.
Gokul

2

Divide and Conquer , her özyineleme düzeyinde üç adım içerir:

  1. Divide alt problemlerden içine sorunu.
  2. Conquer yinelemeli bunları çözerek altproblemleri.
  3. Alt problemlerin çözümünü orijinal problemin çözümünde birleştirin .
    • Bu bir olan yukarıdan aşağıya bir yaklaşım.
    • Alt problemler üzerinde daha fazla iş yapar ve bu nedenle daha fazla zaman tüketimi vardır.
    • Örneğin. Fibonacci serisinin n'inci terimi O (2 ^ n) zaman karmaşıklığında hesaplanabilir.

Dinamik Programlama aşağıdaki dört adımı içerir:

1. En uygun çözümlerin yapısını karakterize edin.
2. Optimal çözümlerin değerlerini tekrar tekrar tanımlayın .
3. En uygun çözümlerin değerini hesaplayın .
4. Construct bir Optimal Çözüm bilgisayarlı bilgilerden .

  • Bu bir olan Aşağıdan yukarı yaklaşım.
  • Yeniden hesaplamak yerine, daha önce hesaplanan değerleri kullandığımız için böl ve fethetmekten daha az zaman harcar.
  • Örneğin. Fibonacci serisinin n'inci terimi O (n) zaman karmaşıklığında hesaplanabilir.

Daha kolay anlaşılması için, böl ve fethetmeyi kaba kuvvet çözümü ve optimizasyonunu dinamik programlama olarak görelim. Çakışan alt problemlere sahip

NB bölme ve fethetme algoritmaları sadece dp ile optimize edilebilir.


Divide and Conquer yukarıdan aşağıya ve Dinamik Programlama yukarıdan aşağıya
Bahgat Mashaly

0
  • Böl ve fethet
    • Çakışmayan alt problemlere girdiler
    • Örnek: faktöriyel sayılar yani olgu (n) = n * olgu (n-1)
fact(5) = 5* fact(4) = 5 * (4 * fact(3))= 5 * 4 * (3 *fact(2))= 5 * 4 * 3 * 2 * (fact(1))

Yukarıda görebildiğimiz gibi, hiçbir gerçek (x) tekrarlanmamaktadır, bu yüzden faktöriyel örtüşmeyen problemlere sahiptir.

  • Dinamik program
    • Çakışan alt problemlere girdiler
    • Örnek: Fibonacci sayıları yani fib (n) = fib (n-1) + fib (n-2)
fib(5) = fib(4) + fib(3) = (fib(3)+fib(2)) + (fib(2)+fib(1))

Yukarıda görebildiğimiz gibi, fib (4) ve fib (3) her ikisi de fib (2) kullanır. benzer şekilde çok fazla fib (x) tekrarlanır. bu yüzden Fibonacci'nin çakışan alt problemleri vardır.

  • DP'de alt problemin tekrarlanması sonucunda, bu sonuçları bir tabloda tutabilir ve hesaplama çabalarından tasarruf edebiliriz. buna notlama denir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.