Not ve dinamik programlama arasındaki fark nedir?


Yanıtlar:


366

Programlama ile ilgili makale: Kılavuz : Dinamik programlama vs not vs tablolama


Not ve dinamik programlama arasındaki fark nedir?

Notlama , önceden hesaplanan sonuçları önbelleğe aldığınız ve aynı hesaplama yeniden gerektiğinde önbelleğe alınan sonucu döndürdüğünüz bir optimizasyon tekniğini tanımlayan bir terimdir.

Dinamik programlama , yinelemeli doğadaki sorunları çözmek için yinelemeli bir tekniktir ve alt problemlerin hesaplamaları çakıştığında uygulanabilir.

Dinamik programlama genellikle tablolama kullanılarak uygulanır, ancak notlama kullanılarak da uygulanabilir. Gördüğünüz gibi, ikisi de diğerinin "alt kümesi" değildir.


Makul bir takip sorusu şudur: Tablolama (tipik dinamik programlama tekniği) ve notlama arasındaki fark nedir?

Dinamik bir programlama problemini tablo kullanarak çözdüğünüzde problemi " aşağıdan yukarıya ", yani önce ilgili tüm alt problemleri çözerek, tipik olarak n boyutlu bir tablo doldurarak çözersiniz. Tablodaki sonuçlara dayanarak, "üst" / orijinal sorunun çözümü daha sonra hesaplanır.

Eğer problemi çözmek için not kullanırsanız, halihazırda çözülmüş alt problemlerin bir haritasını tutarak bunu yapabilirsiniz. Önce " yukarıdan aşağıya " sorununu çözmeniz anlamında " yukarıdan aşağıya " yaparsınız (genellikle alt sorunları çözmek için geri çekilir).

Dan iyi bir slayt burada (bağlantı artık öldü, slayt hala iyi olsa da):

  • Tüm alt problemlerin en az bir kez çözülmesi gerekiyorsa, aşağıdan yukarıya dinamik bir programlama algoritması genellikle yukarıdan aşağıya kaydedilmiş bir algoritmadan sabit bir faktörden daha iyi performans gösterir.
    • Özyineleme için ek yük yok ve masa bakımı için daha az ek yük
    • Zaman ve alan gereksinimlerini daha da azaltmak için dinamik programlama algoritmasındaki normal tablo erişim düzeninden yararlanılabilecek bazı sorunlar vardır.
  • Alt problem alanındaki bazı alt problemlerin hiç çözülmesi gerekmiyorsa, hafızaya alınan çözüm yalnızca kesinlikle gerekli olan alt problemleri çözme avantajına sahiptir.

Ek kaynaklar:


1
Dinamik programlama ve Memoizasyon'u değiştirdiniz. Memoization temelde yinelemeli dinamik bir programlamadır.
user1603602

6
Naah, bence yanılıyorsun. Örneğin, memoization hakkındaki wikipedia makalesinde hiçbir şey, memoizasyon kullanırken özyinelemenin mutlaka dahil olduğunu söylemez.
aioobe

Cevabı okuduktan sonra , konuyla ilgili NZT-48 etkisini hissetmek istiyorsanız , makaleye ve örneğe de bakabilirsiniz
snr

45

Dinamik Programlama, belirli bir karmaşık problemi alt problemlere ayırarak çözen ve aynı sonuçları tekrar hesaplamaktan kaçınmak için alt problemlerin sonuçlarını saklayan algoritmik bir paradigmadır.

http://www.geeksforgeeks.org/dynamic-programming-set-1/

Memoization, daha önce çözülmüş çözümleri izlemek için kolay bir yöntemdir (genellikle dizilere dayalı tablolama yerine genellikle bir karma anahtar değer çifti olarak uygulanır), böylece tekrar karşılaşıldıklarında yeniden hesaplanmamaları için. Hem aşağıdan yukarıya hem de yukarıdan aşağıya yöntemlerinde kullanılabilir.

Notlama ve tablolama hakkındaki bu tartışmaya bakın .

Dinamik programlama, yineleme ilişkilerini / özyinelemeyi çözerek ve daha önce bulunan çözümleri tablolama veya notlama yoluyla depolayarak belirli sorun sınıflarını çözmek için bir yöntemdir. Memoization, daha önce çözülmüş problemlerin çözümlerini takip etmek için bir yöntemdir ve belirli bir girdi seti için benzersiz deterministik çözümlere sahip herhangi bir işlevle kullanılabilir.


14

Dinamik Programlama'ya genellikle Memoization denir!

  1. Memoization yukarıdan aşağıya tekniktir (verilen sorunu parçalayarak çözmeye başlayın) ve dinamik programlama aşağıdan yukarıya tekniktir (önemsiz alt sorundan, verilen soruna doğru çözmeye başlayın)

  2. DP, temel vaka (lar) dan başlayarak çözümü bulur ve yukarı doğru çalışır. DP tüm alt problemleri çözer, çünkü aşağıdan yukarıya yapar

    Yalnızca gerekli alt sorunları çözen Memoization'dan farklı olarak

  3. DP, üstel zaman kaba kuvvet çözümlerini polinom zaman algoritmalarına dönüştürme potansiyeline sahiptir.

  4. DP çok daha verimli olabilir, çünkü yinelemesi

    Aksine, Memoization özyineleme nedeniyle (genellikle önemli) ek yükü ödemek zorundadır.

Daha basit olmak gerekirse, Memoization sorunu çözmek için yukarıdan aşağıya yaklaşımı kullanır, yani çekirdek (ana) problemle başlar, ardından alt problemlere ayırır ve bu alt problemleri benzer şekilde çözer. Bu yaklaşımda aynı alt problem birden çok kez ortaya çıkabilir ve daha fazla CPU döngüsü tüketebilir, dolayısıyla zaman karmaşıklığını artırabilir. Dinamik programlamada ise aynı alt problem birçok kez çözülmeyecek, ancak çözümü optimize etmek için önceki sonuç kullanılacaktır.


10

(1) Memoization ve DP, kavramsal olarak , gerçekten aynı şeydir. Çünkü: DP'nin tanımını göz önünde bulundurun: "üst üste binen alt problemler" "ve optimal alt yapı". Memoizasyon tamamen bunlara sahiptir 2.

(2) Notlandırma DP'dir ve yığın taşması riski özyineleme derindir. DP aşağıdan yukarıya doğru bu riski yoktur.

(3) Memoizasyon için bir karma tablo gerekir. Böylece ek alan ve biraz arama süresi.

Soruyu cevaplamak için:

- Kavramsal olarak , (1) aynı şey oldukları anlamına gelir.

(2) 'yi hesaba katmak, gerçekten isterseniz, memolama DP'nin bir alt kümesidir, yani memoizasyon ile çözülebilen bir problem DP tarafından çözülebilir, ancak DP tarafından çözülebilen bir problem memoizasyon ile çözülemeyebilir (çünkü taşabilir).

(3) dikkate alındığında, performans bakımından küçük farklılıkları vardır.


6

Vikipedi'den:

memoization

Hesaplamada, notlama, daha önce işlenmiş girişler için sonuçların hesaplanmasını tekrarlamaktan kaçınarak fonksiyon çağrıları yaparak bilgisayar programlarını hızlandırmak için kullanılan bir optimizasyon tekniğidir.

Dinamik program

Matematik ve bilgisayar biliminde dinamik programlama, karmaşık problemleri daha basit alt problemlere bölerek çözmenin bir yöntemidir.

Bir problemi daha küçük / daha basit alt problemlere böldüğümüzde, genellikle aynı alt problemle bir kereden fazla karşılaşırız; bu nedenle, önceki hesaplamaların sonuçlarını kaydetmek için Memoization'u kullanırız, böylece bunları tekrarlamamız gerekmez.

Dinamik programlama genellikle notu kullanmanın mantıklı olduğu durumlarla karşılaşır, ancak her iki tekniği de diğerini kullanmadan kullanabilirsiniz.


Ben cevabı gönderdikten sonra OP soruyu düzenledi. Orijinal soru, ikisi arasındaki farkın ne olduğunu sordu.
yurib

4

Hem Memoization hem de Dinamik Programlama bireysel alt problemleri yalnızca bir kez çözer.

Memoization özyineleme kullanır ve yukarıdan aşağıya çalışırken Dinamik programlama sorunu aşağıdan yukarıya doğru çözerek ters yönde hareket eder.

Aşağıda ilginç bir benzetme var -

Yukarıdan aşağıya - Önce dünyayı ele geçireceğimi söylüyorsun. Bunu nasıl yapacaksın? Önce Asya'yı ele geçireceğimi söylüyorsun. Bunu nasıl yapacaksın? Önce Hindistan'ı ele geçireceğim. Delhi Başbakanı olacağım vs.

Aşağıdan yukarıya - Delhi'nin CM'si olacağımı söylüyorsun. Sonra Hindistan'ı, sonra Asya'daki diğer tüm ülkeleri ele geçirecek ve sonunda dünyayı ele geçireceğim.


3

Bir örnek vermek istiyorum ;

Sorun:

Bir merdiven kasasına tırmanıyorsunuz. Zirveye ulaşmak için n adım gerekiyor.

Her seferinde 1 veya 2 adım tırmanabilirsiniz. Zirveye kaç farklı şekilde tırmanabilirsiniz?

resim açıklamasını buraya girin

Memoization ile özyineleme

Bu şekilde, memo dizisi yardımı ile budama (bir ağaç veya çalıdan fazla malzemenin çıkarılması) özyineleme ağacını yapıyoruz ve özyineleme ağacının boyutunu nn'ye indiriyoruz.

public class Solution {
    public int climbStairs(int n) {
        int memo[] = new int[n + 1];
        return climb_Stairs(0, n, memo);
    }
    public int climb_Stairs(int i, int n, int memo[]) {
        if (i > n) {
            return 0;
        }
        if (i == n) {
            return 1;
        }
        if (memo[i] > 0) {
            return memo[i];
        }
        memo[i] = climb_Stairs(i + 1, n, memo) + climb_Stairs(i + 2, n, memo);
        return memo[i];
    }
}

Dinamik program

Bu problemin alt problemlere ayrılabileceğini ve optimal altyapı özelliğini içerebildiğini görebileceğimiz gibi, optimal çözümü alt problemlerinin optimal çözümlerinden verimli bir şekilde inşa edilebilir, bu sorunu çözmek için dinamik programlama kullanabiliriz.

public class Solution {
    public int climbStairs(int n) {
        if (n == 1) {
            return 1;
        }
        int[] dp = new int[n + 1];
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        return dp[n];
    }
}

Örnekler https://leetcode.com/problems/climbing-stairs/ adresinden alınabilir.


2

Sadece iki yol düşünün,

  1. Daha büyük sorunu daha küçük alt sorunlara ayırıyoruz - Yukarıdan aşağıya yaklaşım.
  2. En küçük alt problemden başlayıp daha büyük probleme ulaşıyoruz - Aşağıdan yukarıya yaklaşım.

In Memoization biz oradan bir önbellek ve çağrı arka her işlev çağrısı kaydetme (1.) ile gidin. Yinelemeli çağrılar içerdiği için biraz pahalı.

In Dinamik Programlama biz bir tablo korumak (2.) ile gitmek, tabloda kaydedilen verileri kullanarak altproblemleri çözerek aşağıdan yukarıya, yaygın dp-tablosu olarak anılacaktır.

Not:

  • Her ikisi de Çakışan alt problemlerle ilgili problemlere uygulanabilir.

  • Memoizasyon, özyinelemeli işlev çağrıları sırasındaki ek yükler nedeniyle DP'ye nispeten zayıf performans gösterir.

  • Asimtotik zaman karmaşıklığı aynı kalır.

0

In Dinamik Programlama ,

  • Özyineleme için ek yük yok, masayı korumak için daha az ek yük.
  • Zaman ve alan gereksinimlerini azaltmak için tablonun normal erişim örüntüsü kullanılabilir.

In Ezberleme ,

  • Bazı alt problemlerin çözülmesine gerek yoktur.
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.