Saf bir veri akışı tarzında “artımlı güncelleme” işlevlerinin oluşturulması için bir paradigma var mı?


10

Bu soruyu sormak için doğru terminolojiyi bilmiyorum, bu yüzden bunu birçok kelimeyle anlatacağım, yanımda taşıyacağım.

Arka plan , sadece aynı sayfadayız: Programlar genellikle önbellek içerir - bir zaman / bellek dengesi. Yaygın bir programcının hatası, yukarı akış kaynaklarından / emsallerinden birini değiştirdikten sonra önbelleğe alınan bir değeri güncellemeyi unutmaktır. Ancak veri akışı veya FRP programlama paradigması bu tür hatalardan etkilenmez. Birkaç saf fonksiyonumuz varsa ve bunları yönlendirilmiş bir bağımlılık grafiğinde birbirine bağlarsak, düğümlerin çıkış değerleri önbelleğe alınabilir ve fonksiyonun herhangi bir girişi değişene kadar yeniden kullanılabilir. Bu sistem mimarisi, Veri Akışı Tabanlı Ortamlarda Önbellekleme belgesinde anlatılmaktadır ve zorunlu bir dilde, ezberlemeye az çok benzemektedir.

Sorun : Bir işleve girişlerden biri değiştiğinde, işlevi yine bir bütün olarak yürütmemiz, önbelleğe alınmış çıktısını atmamız ve sıfırdan yeniden hesaplamamız gerekir. Birçok durumda, bu benim için israf gibi görünüyor. "Ne olursa olsun ilk 5" listesini üreten basit bir örneği ele alalım. Girdi verileri, her ne olursa olsun sıralanmamış bir listedir. Sıralı listenin çıktısını veren bir işleve girdi olarak iletilir. Hangi sırayla sadece ilk 5 öğe alan bir fonksiyon girilir. Sözde kodda:

input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45]
intermediate = sort(input)
final_output = substring(intermediate, 0, 5)

Sıralama işlevinin karmaşıklığı O (N log N) 'dir. Ancak bu akışın, girdinin bir seferde sadece biraz değiştiği bir uygulamada, 1 öğe ekleyerek kullanıldığını düşünün. Her seferinde sıfırdan yeniden sıralamak yerine, aslında yeni öğeyi doğru konuma ekleyerek önbelleğe alınmış eski sıralanmış listeyi güncelleyen bir işlev kullanmak aslında O (N) daha hızlı olacaktır. Bu sadece bir örnektir - birçok "sıfırdan" işlev böyle bir "artımlı güncelleme" benzerlerine sahiptir. Ayrıca, yeni eklenen öğe, 5. konumdan sonra olduğu için final_output'ta bile görünmeyebilir.

Sezgim, bu tür "artımlı güncelleme" işlevlerinin bir şekilde mevcut "sıfırdan" işlevlerle yan yana bir veri akışı sistemine eklenmesinin mümkün olabileceğini gösteriyor. Tabii ki, her şeyi sıfırdan yeniden hesaplamak her zaman artımlı güncellemeler yapmakla aynı sonucu vermelidir. Sistem bu özelliğine sahip olması gerekir , eğer tek tek ilkel FromScratch-eklemeli çiftlerinin her biri, her zaman aynı sonucu verir, daha sonra onlardan yapılan büyük birleşik fonksiyonlar da otomatik olarak aynı sonucu verecektir.

Soru : Hem FromScratch işlevlerini hem de Artan meslektaşlarını destekleyebilen, verimlilik için işbirliği yapan ve büyük akışlar halinde oluşturulmuş bir sistem / mimari / paradigma / meta-algoritmaya sahip olmak mümkün müdür? Değilse, neden? Birisi bu paradigmayı daha önce araştırıp yayınladıysa, buna ne denir ve nasıl çalıştığının kısa bir özetini alabilir miyim?


BTW, örneğinizin özel durumunda, bir yığın kullanmak daha da verimli bir çözüm olacaktır . Bir öğe eklemek artık sadece ve üst değerlerinin güncellenmiş sıralanmış bir listesini oluşturmak artık sadece . Ö(günlükn)kÖ(kgünlükn)
j_random_hacker

Yanıtlar:


7

Bu alan birçok kez icat edilmiştir ve aşağıdaki gibi birçok isme girer:

(Ve muhtemelen daha fazlası.) Bunlar aynı değil, birbiriyle ilişkili.

Paraphrasing Cai ve diğerleri (1): Çevrimiçi algoritmaları genel olarak uygulamanın iki temel yolu vardır (yani herhangi bir belirli algoritmik soruna başvurmadan):

  • Statik artım. Statik yaklaşımlar bir programı derleme zamanında analiz eder ve değişen girdilere göre orijinal programın çıktısını verimli bir şekilde güncelleyen artımlı bir versiyon üretir. Statik yaklaşımlar, dinamik yaklaşımlardan daha verimli olma potansiyeline sahiptir, çünkü çalışma zamanında kayıt tutmaya gerek yoktur. Ayrıca, hesaplanan artımlı versiyonlar genellikle sabit katlama veya satır içi gibi standart derleyici teknikleri kullanılarak optimize edilebilir. (1) 'de araştırılan yaklaşım budur.

  • Dinamik artım. Dinamik yaklaşımlar, program çalışırken dinamik bağımlılık grafikleri oluşturur ve değişiklikleri bu grafikler boyunca yayar. En iyi bilinen yaklaşım Acar'ın kendini ayarlayan hesaplama. Anahtar fikir basittir: programlar, dinamik bir bağımlılık grafiğindeki değerler arasındaki bağımlılıkları izleyen gelişmiş bir çalışma zamanı ortamında orijinal girdide yürütülür; ara sonuçlar önbelleğe alınır. (Tahmin edebileceğiniz gibi, bu çok fazla bellek kullanma eğilimindedir ve bu alanda çok fazla araştırma bellek kullanımını nasıl sınırlandıracağınızla ilgilidir.) Daha sonra, girdideki değişiklikler, değiştirilen girişlerden sonuçlara, Nihai sonuçlar; bu işlem genellikle yeniden hesaplamadan daha verimlidir. Bununla birlikte, dinamik bağımlılık grafikleri oluşturmak, çalışma sırasında rapor edilen deneylerde 2 ila 30 arasında değişen büyük bir sabit faktör yükü getirir.

Buna ek olarak, her zaman verilen bir algoritmanın çevrimiçi sürümü ile 'elle' denenebilir. Bu zor olabilir.


(1) Y. Cai, PG Giarrusso, T. Rendel, K. Ostermann, Yüksek Dereceli Diller İçin Değişim Kuramı: λ-Calculi'yi Statik Farklılaşma ile Arttırmak .


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.