Programlamada DAG (Yönlendirilmiş Asiklik Grafik) ne zaman kullanılır?


37

Geçenlerde ecto adında bir çerçeve buldum .

Bu çerçevede, ecto Yönlendirilmiş Asiklik Grafiği olan " plazm " adı verilen temel bir bileşendir .

Bu mekanizmanın avantajının ne olduğunu ve diğer durumlarda DAG kavramından yararlanabileceğimizi merak ediyorum.


6
Çoğu Kaynak Kontrol Yönetim Sistemi revizyonları DAG olarak uygular.
Oded

1
Planlama , DAG ile çok ilgilenen sorunların bütünüdür .
TC1

1
Ağaç olarak temsil edilen birçok şey , garip-henüz-hala-biraz da yaygın olan kenar durumları göz önüne alındığında , gerçekten DAG olarak temsil edilmelidir .
Joachim Sauer

@ JoachimSauer örneğin sert bağlantılı dosya sistemleri
jk.

Yanıtlar:


29

Güzel soru.

  • Kod, kod içinde gerçekleştirilen her aritmetik işlemin giriş ve çıkışlarını açıklayan bir DAG ile temsil edilebilir; Bu gösterim derleyicinin ortak alt-ifade elemesini etkin bir şekilde gerçekleştirmesini sağlar.
  • Çoğu Kaynak Kontrol Yönetim Sistemi revizyonları DAG olarak uygular.
  • Birkaç Programlama dili, yönlendirilmiş bir asiklik grafikle birbirleriyle ilişkili olan değer sistemlerini tanımlar. Bir değer değiştiğinde, halefleri yeniden hesaplanır; her değer DAG'deki öncekilerin bir işlevi olarak değerlendirilir.
  • DAG, bir dizi süreç ve kaynak arasındaki bağımlılığı gösterdiği için kilitlenmeleri algılamakta kullanışlıdır.
  • Hesaplamalı geometrideki birçok randomize algoritmada, algoritma, daha sonra daha küçük ölçekli özelliklerle değiştirilen bazı geometrik yapıların özelliklerini temsil eden bir geçmiş DAG'yi korur; nokta konum sorguları, yukarıdaki iki veri yapısında olduğu gibi, bu DAG içerisindeki yolları takip ederek cevaplanabilir.
  • DAG’ın hafızasına girdikten sonra tüm setin maksimum çalıştırma süresini hesaplamak için algoritmalar yazabiliriz.
  • Elektronik tablo sistemlerini programlarken, ilk hücre, ikinci hücrede değeri kullanan bir formülü saklarsa, bir hücreyi diğerine bağlayan bağımlılık grafiği, yönlendirilmiş bir asiklik grafik olmalıdır. Bağımlılık döngüleri, döngüde yer alan hücrelerin iyi tanımlanmış bir değere sahip olmamasına neden olduğu için izin verilmez. Ek olarak, bağımlılıkların asiklik olmasını istemek, elektronik tablo değiştirildiğinde hücre değerlerinin yeniden hesaplanmasını programlamak için kullanılan topolojik bir sıraya izin verir.
  • DAG kullanarak hesaplamaları doğru sırayla değerlendirmek için algoritmalar yazabiliriz.

DÜZENLE :

  • Elektronik tablolardaki formül değerlerini yeniden hesaplarken formül hücre değerlendirmesinin sıralanması DAG'ler kullanılarak yapılabilir
  • Git, içerik depolamak için DAG'lar, kafalar için referans işaretçiler, nesne modeli gösterimi ve uzak protokol için kullanır.
  • DAG'lar İz zamanlamasında kullanılır: küresel zamanlama için ilk pratik yaklaşım olan iz zamanlama, en sık gerçekleştirilen kontrol akış yolunu optimize etmeye çalışır.
  • Ecto bir işleme çerçevesidir ve grafik çizimleri senkronize yürütme emri vermesi için işleme grafiklerini modellemek için DAG kullanır. Ecto'daki Plazma DAG'dir ve Zamanlayıcı bunun üzerinde çalışır.
  • DAG'lar, döngüleri optimize etmek için kullanılan bir teknik olan yazılım boru hattında, donanım boru hattını paralel hale getirecek şekilde kullanılır.

İyi Kaynaklar:


1
Döngü yok mu? Bir döngü sona erdiği sürece kalifiye olması gerektiğini düşünüyorum. A -> B -> C olmak yerine, A -> B -> A1 -> B1 -> A2 -> B2 -> C'ye gidebilir. Bir çemberden çok bir spiral gibi.
GlenPeterson

@GlenPeterson, Evet haklısınız. Cevabımı düzenledim. Yorum için teşekkürler. :)
Md Mahbubur Rahman

Hala "Düz Çizgi" nin gerekli olduğunu düşünmeyin. DAG’deki 'G', Graph anlamına gelir. Aşağıdaki cevabımı kontrol et. Maalesef cevaplamadan önce sizinkini yeterince dikkatli okumadım, ancak bütünlüğünüz ve aydınlanma seviyeniz için cevabınızı + 1'ledim.
GlenPeterson

@GlenPeterson, Hata için özür dilerim. Cevabımı güncelledim. Ben de cevabını beğendim. Böylece cevabınıza +1 yaptı.
Md Mahbubur Rahman

3
+ 1'iniz için teşekkürler. Hala tüm kodların DAG olduğunu düşünüyorum, aritmetik ifadelerle sınırlı değil. G / Ç, istisnalar, çok işlemli etkileşimler ve donanım kesintileri, bir Yönlendirilmiş (başlangıç ​​veya bitiş oldukları için) diğer tüm başlangıç ​​veya bitiş düğümleridir, Asiklik (sonsuz döngüler yoktur) Grafik (sıralı düğüm çiftleri kümesi) . Ricky'nin sorusuna ilginç bir takip, "DAG olmayan herhangi bir doğru ve çalışan kod var mı" olabilir. Cevabın "Hayır" olduğunu düşünüyorum, ancak birinin beni yanılttığını kanıtladığı için memnun olurum.
GlenPeterson

12

Cevap, programlama ile ilgisi olmadığıdır. Problem çözme ile ilgili olmalı.

Bağlantılı listeler gibi, belli problem sınıfları için kullanılan veri yapıları gibi, grafikler de belirli ilişkileri temsil etmek için kullanışlıdır. Bağlantılı listeler, ağaçlar, grafikler ve diğer soyut yapıların yalnızca kodlamada bunları uygulayabileceğiniz programlama bağlantısı vardır. Onlar daha yüksek bir soyutlama seviyesinde varlar. Programlama ile ilgili değil, sorunların çözümünde veri yapılarını uygulamakla ilgili.

Hala programlama ile biraz ilişki istiyorsanız, lütfen aşağıdaki noktaları göz önünde bulundurun:

  • DAG ( Grafikler İçin Bekle - daha fazla teknik ayrıntı olarak bilinir ), bir dizi işlem ve kaynak arasındaki bağımlılıkları gösterdikleri için kilitlenme algılamakta kullanışlıdır (ikisi de DAG'daki düğümlerdir). Bir döngü algılandığında kilitlenme gerçekleşir.
  • DAG’ı belleğe aldıktan sonra, algoritmaları şu adreslere yazabilirsiniz:
    • Hesaplamaların doğru sırada yapıldığından emin olun ( topolojik sıralama )
    • Hesaplamalar paralel olarak yapılabiliyorsa, ancak her hesaplamanın maksimum yürütme süresi varsa, tüm kümenin maksimum yürütme süresini hesaplayabilirsiniz.

1
Bunun yalnızca programlama kapsamının ötesinde nasıl olduğunu göstermek için, ilişkisel bir veritabanındaki tabloları yoldan 1 tablodan diğerine zihinsel olarak ayrıştırmak için tabloları nasıl beyaz tahtaya yazdığınızı düşünün, bu, zihinsel olarak DAG'ın performansını belirlemek için veri modeliniz
Jimmy Hoffa

6

Diğer insanlar verilere DAG uyguladılar, ancak kodlamanın en azından uygulanabilir olduğunu düşünüyorum. Mahbubur R Aaman bundan bahseder, yani gerçekten bu, cevabına kendi başına tamamlanmış bir cevaptan ziyade bir zeyilnamedir.

Bana sonsuz döngülerden yoksun olan zorunlu bilgisayar programlarından daha çok rastlanır (teşekkürler @AndresF.), Directed Acyclic Graph (DAG). Anlamı, kodun olası çalıştırma yollarının yönlendirilmesi (önce bunu, sonra da) ve asiklik (sonsuz döngüler oluşturmama) olmasıdır. Bunlar bir grafik çünkü herhangi bir önemli koddan geçen yol nadiren liste veya ağaç kadar basittir.

XSLT'de 4 yıl çalıştım. Bunun neden iyi bir genel amaçlı programlama dili olmadığını açıklamaya çalışırken çok kötü bir zaman geçirdim, ancak DAG bunun nedeni. Özellikle, XSLT veri odaklı bir dildir. İşlevleri tanımlarsınız (evet, işlevsel programlama anlamında) ancak bu işlevleri kodunuzdan çağırmanız gerekmez. Aksine, XSLT, bir giriş XML belgesinin düğümlerinin seçim ve yineleme kombinasyonunu ayarlar. Bu, giriş verilerinin yapısının hangi fonksiyonların çağrılacağını ve hangi sırayla olduğunu belirlemenizi sağlar.

Programınız 2: 30'da test etmediğiniz bir veri koşulu ile karşılaşıncaya kadar bu çok ilginç ve çok havalıydı ve uyanıp düzeltmeniz gerekiyordu. Verilerin DAG'yi tanımlamasına izin verdiğinizde, DAG'ın tanımı tüm olası giriş koşulları olur - önemsiz olmayan herhangi bir ticari uygulama için hesaplanamaz; onlar düşünülemez.

İlk başta, işlevsel programlamanın bir DAG olamayacağını düşündüm çünkü yürütme sırası bazen programcı tarafından açıkça anlaşılmıyor, hatta düşünülüyordu. Ancak işlevsel bir program bağımlılıkları tanımlar. Aslında, işlevsel programlamanın bildirim niteliği, yürütme sırasını belirtmeden ('b' veya 'c' nin karesi olup olmadığı önemli değildir) sadece bağımlılıkları tanımlamak olarak düşünülebilir (a ^ 2 = b ^ 2 + c ^ 2). , ikisi birlikte eklenmeden önce kareler olduğu sürece).

Ancak, İşlevsel programlama, ayrıntılı bir düzeyde işlemlerin sırası hakkında kasıtlı olarak belirsiz olsa da, bağımlılıklar hakkında kesin olarak anlaşılır. Bunlar eşzamanlılık için elverişli kılan özelliklerdir. Her durumda, kod boyunca yolların bir grafiği hala vardır ve bu grafik hala yönlendirilir (bağımlılıklar bağımlı görevlerden önce değerlendirilmelidir), bu yüzden DAG'nin orada da geçerli olduğunu düşünüyorum.

Güzel soru - gönderdiğiniz için teşekkürler!


1
Bu zorunlu program sizce bir DAG while (true) { print("hi"); }mı : Belki de sonlandırılmayan programları hariç tutmak istersiniz?
Andres F.

5

Şu anda programlamada DAG kullanılmamaktadır. Tarihsel olarak gelişme ile ilgili birçok şey ağaçlar ve hiyerarşiler ile yapılmıştır, çünkü bir kutudaki bir şeyi hareket ettirmek, beynimizin karmaşık işleri yönetmesini kolaylaştırmak için elverişlidir. Ancak olaylara ve bunların diğer olaylara ve durumlara nasıl bağımlı olduklarına bakarsanız, DAG alacaksınız çünkü hayatımızdaki ve programdaki herhangi bir şey geçmişte herhangi bir şeye bağlı olabilir, ancak gelecekte değil, bu nedenle mükemmel bir "asiklik" elde edersiniz. DAG kavramına uygulanabilir ilişkiler. Bu nadiren gelişimde açıkça kullanılmasına rağmen, bunun akılda tutulması işleri daha iyi anlamaya yardımcı olacaktır.


2

Plato’nun Ecto’daki avantajının ne olduğunu merak ediyorum.

DAG, belirli görevlerin diğerlerinden önce yapılması gereken kısıtlamaya sahip bir dizi görevi modellemek için kullanılabilir. Ecto bir işleme çerçevesidir ve grafik çizimleri senkronize yürütme emri vermesi için işleme grafiklerini modellemek için DAG kullanır. Plasm içinde Ecto DAG ve Zamanlayıcı üzerinde çalışır.

DAG kavramını başka hangi durumlarda kullanabiliriz?

  • DAWG , bir dizi diziyi temsil eden ve verilen bir dizenin uzunluğuyla orantılı zamanda sete ait olup olmadığını test eden bir sorgulama işlemine izin veren bir veri yapısıdır.
  • Git , içerik depolamak için DAG'lar, kafalar için referans işaretçiler, nesne modeli gösterimi ve uzak protokol için kullanır.

Uzun zaman olmuş olmasına rağmen ... ama bence bu cevap ekto ruhunu anlamama gerçekten yardımcı oluyor. İşaret etmeliyim. Teşekkürler!
Po-Jen Lai,

0

Gerçek bir dünya örneği olarak yazılımımız, son kullanıcının bir görüntü üzerinde gerçekleştirilecek bir dizi işlemi tanımlayabileceği bir IDE'ye benzer (makine vizyon incelemesi). Bu denetimler diğer denetimlere bağımlı olabilir veya bunlara bağlı denetimler yapabilir. Bunların hepsi son kullanıcı tarafından yapılandırılabildiğinden, tasarım zamanında paralel işleme için optimizasyon yapamayız. Bu denetimleri ve bağımlılıkları bir DAG olarak temsil ederek, genel denetimin paralelliğini çalışma zamanında maksimum performans için optimize edebiliriz.


-1

Sadece başka bir örnek için, Cocoa uygulamalarındaki bellek yönetimi kuralları, tüm güçlü referansların sızıntı olmaması için yapılan yönlendirilmiş bir asiklik grafiği oluşturması için yapılmıştır.


-2

Başka bir cevap eklemek gibi make, bina bağımlılıklarını bulmak için DAG kullanan sistemleri kurmak için bir referans görmedim .

Daha fazla ayrıntı burada


Yanlış bir şey mi söyledim, neden düşürüldü
dlmeetei

Oldukça eski bir soruyu, oldukça zayıf bir cevabı ile çarptınız. "Bunu başka hiç kimseden bahsetmediği için ekleyen ..." ve sadece tek bir cümleye sahip bir cevap yazmaya istekli iseniz, bu bir cevap için iyi değildir. Lütfen soruyu tam olarak cevaplamaya çalışın ve uygulamanın bir DAG'yi nasıl kullandığını ve bu tasarımın nasıl çalıştığını ve bunun neden diğer seçeneklere göre seçildiğini açıklayın. İdeal olarak, içeriğe değer birkaç paragraf.

Tamam, daha sonra ayrıntılı olarak
açıklayayım

Tamam, yinelenmek yerine, Sadece şu gibi araçlarda nasıl kullanıldığını ayrıntılandıran bir bağlantıyla güncellendimake
dlmeetei

Bağlantıların bayatlama veya başarısız olma gibi kötü bir alışkanlığı vardır. Bu olursa, başladığınız yere geri dönersiniz - çok yardımcı olmayan kısa bir tek satırlık cevap. Bağlantının içeriğini özetleyebilir misiniz, böylece bu cevap kendi başına durabilir mi? (Bağlantıyı koruyun, cevabın bağlantı olmadan bile iyi bir cevap olduğundan emin olun).
Dan Pichelman,
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.