Dinamik Programlamada Bir Olgu Ayrımı: Örnek Gerekli!


19

Bir süredir dinamik programlama üzerinde çalışıyorum. Dinamik bir programlama özyinelemesini değerlendirmenin standart yolu, gerekli tüm değerlerin bir tablosunu oluşturmak ve satır satır doldurmaktır. Giriş için Cormen, Leiserson ve ark.'nın "Algoritmalara Giriş" bölümüne bakınız .

Tablo tabanlı hesaplama şemasına iki boyutta (satır satır doldurma) odaklanıyorum ve hücre bağımlılıklarının yapısını araştırıyorum, yani başka bir hücrenin hesaplanabilmesi için hangi hücrelerin yapılması gerekiyor. Biz birlikte göstermek hücre hücre endeksleri sette i bağlıdır. Γ'nin çevrimsiz olması gerektiğini unutmayın .Γ(i)iΓ

Hesaplanan gerçek fonksiyondan soyutladım ve özyinelemeli yapısına konsantre oldum. Resmen, bir recurrrence düşünün olmaya dinamik programlama o formu varsad

d(i)=f(i,Γ~d(i))

ile , ~ Γ d ( i ) = { ( j , d ( j ) ) | jΓ d ( i ) } ve f değil bazı (hesaplanabilir) işlevi ˜ Γ d dışında d kullanın .i[0m]×[0n]Γ~d(i)={(j,d(j))|jΓd(ben)}fdΓ~d

nin tanecikliği , mevcut hücrenin (sol, üst-sol, üst, üst-sağ, ...) pürüzlü alanlarıyla kısıtlanırken, esasen üç vakanın (simetri ve dönüşe kadar) geçerli olduğu gözlemlenir. tablonun nasıl doldurulabileceğini bildiren dinamik programlama özyinelemeleri:Γd

Üç dinamik programlama hücresi bağımlılığı vakası

Kırmızı alanlar (aşırı yakınlık) den anlamına gelir . Birinci ve ikinci durumlar alt kümeleri kabul etmektedir, üçüncü durum en kötü durumdur (dizin dönüşümüne kadar). Kırmızı alanların tamamının Γ ile örtülmesi kesinlikle gerekli değildir ; tablonun her kırmızı kısmındaki bazı hücreler kırmızıya boyamak için yeterlidir. Beyaz alanlar explictly gerekmektedir değildir Gerekli hücreleri içerir.ΓΓ

Birinci durum için örnekler düzenleme mesafesi ve en uzun ortak alt dizidir , ikinci durum Bellman & Ford ve CYK için geçerlidir . Daha az belirgin örnekler arasında, teklif edilen vakalara uyacak şekilde döndürülebildikleri için satırlar (veya sütunlar) yerine köşegenler üzerinde çalışma; Örnek için Joe'nun cevabına bakınız .

Yine de üçüncü vaka için (doğal) bir örneğim yok! Benim sorum şu: Üçüncü vaka dinamik programlama özyinelemeleri / sorunları için örnekler nelerdir?


2
Vaka 3 1 ve 2
numaralı

Görünüşe rağmen değil. Olgu 3 örneği ise, örneğin, bir kasa 1, örneğin, sol üst bölgesinde gerekli bir hücre olamaz sahip sol üst bölgesinde gerekli bir hücre olması. Açıklamak için açıklamayı düzenledim.
Raphael

Yanıtlar:


15

Deseninize hiç uymayan birçok dinamik programlama algoritması örneği vardır.

  • En uzun artan alt sekil problemi sadece tek boyutlu bir tablo gerektirir.

  • Tabloları üç veya daha fazla boyut gerektiren birkaç doğal dinamik programlama algoritması vardır. Örneğin: Bir bitmapteki maksimum alan beyaz dikdörtgeni bulun. Doğal dinamik programlama algoritması üç boyutlu bir tablo kullanır.

  • Ancak en önemlisi, dinamik programlama tablolarla ilgili değildir ; çözülme özyineleme ile ilgilidir. Ara sonuçları saklamak için kullanılan veri yapısının bir dizi olmadığı birçok doğal dinamik programlama algoritması vardır, çünkü çözülen yineleme bir tamsayı aralığının üzerinde değildir. İki kolay örnek, bir ağaçtaki en büyük bağımsız köşe kümesini bulmak ve iki ağacın en büyük ortak alt ağacını bulmaktır. Daha karmaşık bir örnek, Arora ve Mitchell'in Öklid gezici satıcısı problemi için -yakım algoritmasıdır.(1+ϵ)


Cevabınız için teşekkürler, ancak soruyu açıkça iki boyutlu problemlerle ve kanonik, tablo tabanlı hesaplama şemasıyla (bu noktayı daha da açık hale getirmek için düzenlenmiş) sınırlandırdım. Daha genel çerçevenin farkındayım ama bu noktada onunla ilgilenmiyorum.
Raphael

9
Tamam, ama bence bu noktayı kaçırıyorsun.
JeffE

Birçok upvotes olduğu için bunu netleştirmem gerektiğini düşündüm: Bu yazı soruya cevap vermiyor ve aslında bunu yapmaya bile çalışmıyor.
Raphael

2
@ Raphael doğrudur. Benim "cevabım" bir cevap değil, sorunun bir eleştirisidir, ama bir yorum yapmak için çok uzundu.
JeffE

3

Ackermann fonksiyonunun hesaplanması bu ruh halindedir. hesaplamak için bazı büyük k için A ( m , n - 1 ) ve A ( m - 1 , k ) bilmeniz gerekir . Ya ikinci koordinat azalır ya da birincisi azalır ve ikincisi potansiyel olarak artar.bir(m,n)bir(m,n-1)bir(m-1,k)k

Sütun sayısı sonsuz olduğundan ve hesaplama genellikle ezberleme ile yukarıdan aşağıya yapıldığından, bu ideal olarak gereksinimlere uymaz, ancak bahsetmeye değer olduğunu düşünüyorum.


1
Hayır, gibi yerleştirme, gerçekten dinamik programlamaya borç vermez. Hehe, bu çok garip, tanımlarımın bu tür vakaları bir şekilde dışladığını kontrol etmem gerekecek. İlkel olmayan özyinelemeli DP, oh my ...A(m1,A(m,n1))
Raphael

1
Bu cevabın neden reddedildiğinden emin değilim, çünkü iyi bir cevap. Ackermann işlevi dinamik programlama için son derece iyi bir ödünç vermektedir. Genel olarak, aynı argümanlar için tekrar tekrar hesaplanan özyinelemeli olarak tanımlanmış herhangi bir işlev, dinamik programlamaya katkıda bulunur. Bunu görmek için sadece onu uygulamak ve çalışma sürelerini karşılaştırmak gerekir. Sıradan Ackermann işleviyle hesaplanması yıllar süren dinamik programlama işleviyle saniyeler alabilir.
Jules

@Jules: Standart tablo düzeni için sorun, a priori tablo boyutuna bağlı (ilkel özyinelemeli) bilmemenizdir. Tabii ki memoisation yapabilirsiniz, ancak her zamanki gibi değil. Yani evet, DP için uygun olabilir, ancak sorumun ilgilendiği sorun sınıfına uymuyor.
Raphael

1
Ben tablo boyutu bir priori bağlı DP için bir gereklilik olduğunu sanmıyorum? Aslında JeffE'den bahsedildiği gibi, önbelleğin bir tablo olması gerekmez. Herhangi bir ilişkisel veri yapısı olabilir. DP gerçekten çok basit bir fikir: özyinelemeli olarak tanımlanmış bir işlevi hesaplamak istiyorsunuz, ancak bu işlev aynı argümanlarda tekrar tekrar çağrılıyor. DP, her vakayı yalnızca bir kez hesapladığınızdan emin olmak için önbellek sunduğunuz optimizasyondur. İki sınırlı tamsayının işlevleri olsa bile, her iki durumunuza da sığmayan birçok işlev vardır.
Jules

2

Bu durum vaka 3'e tam olarak uymuyor, ancak vakalarınızdan herhangi birinin dinamik programlamayı öğretmek için kullanılan çok yaygın bir sorunu yakalayıp yakalamadığını bilmiyorum: Matris Zinciri Çarpma . Bu problemi çözmek için (ve diğerleri, bu sadece kanonik olanıdır) matrisi satır satır yerine diyagonal olarak dolduruyoruz.

Kural böyle bir şeydir:

diagMatrix


1
Bu şekilde yazılmışsa, aslında hiçbir duruma uymuyor. Ancak, saat yönünde 45 derece döndürürseniz, durum 2'yi (ve ima edilen tüm özellikleri) alırsınız. Bu, diyagonalden köşelere doğru çalışan diğer örnekler için de geçerlidir. Ama bahsettiğiniz için teşekkürler!
Raphael

@ Raphael bunların eşdeğer olduğu hemen belli değil, sorunuzda bundan bahsetmek isteyebilirsiniz.
Joe

0

Aptalca bir örnek biliyorum, ama bence basit bir yinelemeli problem

Kare matristeki sayıların toplamını bulma

uygun olabilir. Geleneksel "her sütun için her satır için" tür 3 durumunuza benziyor.


-1

Bu tam olarak aradığınız arama alanı değil, ama başımın üst kısmı hakkında yardımcı olabilecek bir fikrim var.

Sorun :

n×nMxM

Cevap

Bu, aşağıdaki özyineli yolla çözülebilir:

k=1+n2xmk,kx<mk,kmi,jkinkjn1/4x>mk,k1/4. İlk yinelemeden sonra, arama alanının boyutu olur34n2x(34)3n2


1
Bu dinamik programlamanın bir örneği değil, değil mi?
Raphael
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.