Dizi olmadan not alma


14

Cormen ve arkadaşlarının Algoritmalara giriş bölümünde, bölüm 15.3 Dinamik programlamanın öğeleri notu şu şekilde açıklar:

Bir memoized özyinelemeli algoritma, her alt probleme çözüm için bir tabloda bir giriş tutar. Her tablo girişi başlangıçta girdinin henüz doldurulmadığını gösteren özel bir değer içerir. Özyinelemeli algoritma açıldığında alt sorunla ilk karşılaşıldığında, çözümü hesaplanır ve tabloda saklanır. Bu alt problemle karşılaştığımız her seferinde, tabloda depolanan değeri ararız ve geri veririz.

Ve bir dipnot olarak ekler:

Bu yaklaşım tüm olası alt problem parametrelerini bildiğimizi ve tablo pozisyonları ile alt problemler arasındaki ilişkiyi kurduğumuzu varsayar. Bir başka, daha genel yaklaşım, alt problem parametreleri ile hash anahtar olarak kullanarak not almaktır.

Bir (çok boyutlu) diziden ziyade, kaydedilmiş değerleri sözlükte depolamayı gerektiren (veya kolaylaştıran) iyi bilinen DP sorunları var mı?


Arka plan: Bu herhangi bir kullanımda ise, bu sorunun nedeni, (kendi kendini dengeleyen) ikili arama ağaçlarının kavramını yeni dinamik programlama görmüş insanlara motive etmeye çalışıyorum.


Çalıştığım gerçek yazılımda, hatırlatma, koddaki birçok farklı yerden nispeten pahalı bir işlevin ( exp , log veya pow gibi ) çağrılabileceği ve genellikle birkaç kez çağrıldığı gerçeğinden yararlanabilir. her bir kod konumundan aynı değer. Bu durumda, "sözlük", kod konumuna özgü bir değişkende depolanan tek bir değer olabilir.
Mike Dunlavey

Yanıtlar:


5

Muhtemelen daha iyi örnekler vardır, ama işte başımın tepesinden bir tane:

S,Td>d


3

2 örnek vermek istiyorum.

0-1 Sırt çantası sorunu

0-1 Sırt Çantası problemi durumunda (burada W , sırt çantasının kapasitesi ve N bir miktar öğedir ), bazen yukarıdan aşağıya Dinamik Programlama'yı sistematik aşağıdan yukarıya numaralandırma yerine notla kullanmak daha iyidir WxN boyutundaki tüm 2D dizisinin (özellikle W sırt çantasının kapasitesinin büyük olduğu, ancak öğelerin ağırlık kombinasyonlarının izin verilen kümesinin kardinalitesi W'den çok daha küçük olduğunda ).

Bu durumda, bir belleğin ekonomisi uğruna, 2B dizisi yerine notlama için sözlüğü kullanmayı seçebilirsiniz.

Earley ayrıştırma algoritması

Earley ayrıştırma algoritması , bağlamsız bir dilbilgisine ait olan ifadelerin ayrıştırılması için kullanılabilir. CYK algoritmasının aksine (aşağıdan yukarıya DP yaklaşımına dayanır ve notlama için 2D tablo kullanır) - Earley ayrıştırıcısı yukarıdan aşağıya yaklaşımını notlama için ayrıştırma grafiğiyle birlikte kullanır .

Ayrıştırma çizelgesi kısmen ayrıştırılmış dilbilgisi üretimlerini içerir (örneğin: X → AB üretimi göz önüne alındığında ve bu üretimin A bölümünün başarılı bir şekilde eşleştirilmesinden sonra , kısmen eşlenen üretimi ayrıştırma çizelgesinde saklar: X → A • B , burada nokta noktaları eşleşen bölüme).

Ayrıştırma grafiğindeki sütun miktarı, belirteç miktarına eşittir. Bununla birlikte, genel olarak, sütun başına kısmen ayrıştırılmış dilbilgisi üretimlerinin miktarını tahmin etmek çok zor olabilir (dilbilgisine ve belirli token dizisine bağlıdır).

Bu nedenle, sözlük veri yapısına dayalı olarak ayrıştırma grafiğini uygulamak daha uygundur.

Doğal Dil İşleme alanında, genellikle Earley pareser daha uygun bir seçimdir, çünkü dilbilgisi için Chomsky normal formunu gerektirmez (ve CYK böyle bir gereksinime sahiptir).


0

Rekabetçi programlama deneyimimde, bir karma tablo (Python dictveya benzeri) kullanmak genellikle bir dizi kullanmaktan daha uygundur, çünkü herhangi bir yıkanabilir veri türü, dizeler, kümeler ( frozensetPython'da) veya tuples gibi anahtar olarak kullanılabilir (string, int). Bir dizi kullanıyorsanız, tüm anahtarları manuel olarak tamsayılara (0'dan başlayarak) çevirmelisiniz, bu da ekstra iş gerektirir ve kaynak notlarınız olarak, tuşların alanını önceden bilmiyorsanız mümkün olmayabilir. Yani sözlükler dizilerden daha geneldir.

Tabii ki, dizileri kullanmaktan kurtulabiliyorsanız, muhtemelen daha hızlıdır çünkü art arda hesaplama yapmaktan kaçınır (diğer taraftan önce tüm dizinin başlatılmasını gerektirir, bu da zaman ve bellek alır), ancak kodu yazmak daha uzun sürebilir çünkü tüm anahtarları tamsayılara çevirmek için ekstra bir iş yapmanız gerekiyor.

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.