何时在编程中使用DAG(有向无环图)?


37

我最近找到了一个名为ecto的框架。

在此框架下,命名为基本组分“血浆”,它是胞外有向非循环Graph.In外生,血浆可以通过胞外调度器来操作。

我想知道这种机制的优点是什么,在其他情况下我们可以利用DAG的概念吗?


6
大多数源代码管理系统将修订版本作为DAG实施。
Oded 2012年

1
计划是整个问题的一个分支,涉及到DAG 的很多问题
TC1 2012年

1
当牢记奇怪但还有些常见的边缘情况时,许多以树表示的事物实际上应该以DAG表示。
Joachim Sauer 2012年

@JoachimSauer例如具有硬链接的文件系统
jk。

Answers:


29

好问题。

  • 代码可以由DAG表示,该DAG描述在代码内执行的每个算术运算的输入和输出;此表示形式允许编译器有效地执行公共子表达式消除。
  • 大多数源代码管理系统将修订版本作为DAG实施。
  • 几种编程语言描述了通过有向无环图相互关联的值的系统。当一个值更改时,将重新计算其后继;每个值都根据其DAG中其前身的函数进行评估。
  • DAG可以方便地检测死锁,因为它们说明了一组进程和资源之间的依赖性。
  • 在许多计算几何中的随机算法中,该算法会保留一个历史DAG,以表示某些几何构造的特征,这些特征已被后来的更小尺度的特征所取代;对于上述两个数据结构,可以通过遵循此DAG中的路径来回答点位置查询。
  • 一旦将DAG存储在内存中,就可以编写算法来计算整个集合的最大执行时间。
  • 在对电子表格系统进行编程时,如果第一个单元格存储使用第二个单元格中的值的公式,则将一个单元格连接到另一个单元格的依赖图必须是有向无环图。不允许依赖循环,因为它们会使循环中涉及的单元格没有明确定义的值。此外,要求依赖项是非循环的,这样在更改电子表格时可以使用拓扑顺序来安排单元格值的重新计算。
  • 使用DAG,我们可以编写算法以正确的顺序评估计算。

编辑:

  • 可以使用DAG在电子表格中重新计算公式值时对公式单元格评估进行排序
  • Git使用DAG进行内容存储,使用引用指针进行头部,对象模型表示和远程协议。
  • DAG用于跟踪调度:跟踪调度是第一种实用的全局调度方法,它试图优化最常执行的控制流路径。
  • Ecto是一个处理框架,它使用DAG对处理图形进行建模,以便图形执行有序的同步执行。Ecto中的Plasm是DAG,并且Scheduler对其进行操作。
  • DAG用于软件流水线,它是一种用于并行化硬件流水线的优化循环的技术。

良好的资源:


1
没有循环?我认为只要循环终止,它就应该合格。而不是成为A-> B-> C,它可能会变为A-> B-> A1-> B1-> A2-> B2->C。更像是螺旋而不是圆。
GlenPeterson

@GlenPeterson,是的,您是对的。我已经编辑了答案。感谢您的评论。:)
Mh Mahbubur Ra​​hman 2012年

仍然不要认为“直线”是必要的。DAG中的“ G”代表Graph。在下面查看我的答案。抱歉,在回答之前,我没有足够仔细地阅读您的内容,但是我为您的完整性和整体启发程度+1了。
GlenPeterson,2012年

@GlenPeterson,对不起,我很抱歉。我已经更新了答案。我也喜欢你的回答。因此对您的答案+1。
Mh Mahbubur Ra​​hman 2012年

3
感谢您的+1。我仍然认为所有代码都是DAG,而不仅限于算术表达式。I / O,异常,多进程交互和硬件中断都只是Directed中的其他开始或结束节点(因为它们是开始或结束),非循环(无无限循环)图(节点的有序对的有限集合) 。对Ricky问题的一个有趣的跟进可能是:“是否有任何不是DAG的正确且有效的代码”。我认为答案是“否”,但是很高兴有人证明我做错了。
GlenPeterson,2012年

12

答案是,它与编程没有任何关系。它与解决问题有关。

就像链表是用于某些类型问题的数据结构一样,图对于表示某些关系也很有用。链表,树,图和其他抽象结构仅与编程有关,因为您可以在代码中实现它们。它们以更高的抽象级别存在。这与编程无关,而在于在解决问题中应用数据结构。

如果仍然想与编程建立某种关系,请考虑以下几点:

  • DAG(称为Wait-For-Graphs-更多技术细节)在检测死锁时非常方便,因为它们说明了一组进程和资源(均为DAG中的节点)之间的依赖性。当检测到周期时,将发生死锁。
  • 将DAG存储在内存中后,您可以将算法编写为:
    • 确保以正确的顺序评估计算(拓扑排序
    • 如果可以并行执行计算,但是每个计算都有最大执行时间,则可以计算整个集合的最大执行时间

1
为了再次说明这超出了编程的范围,请考虑一下如何在关系数据库中的表上进行白板处理以从心理上分析从一个表到另一个表的路径的长度,这等效于从脑海中使用DAG来确定性能。您的数据模型
Jimmy Hoffa 2012年

6

其他人已经将DAG应用于数据,但是我认为它至少在代码上是适用的(如果不是更多的话)。Mahbubur R Aaman提到了这一点,因此,实际上,这不仅仅是他自己的完整答案,更是他的答案的附录。

对我而言,它比任何无穷循环的命令式计算机程序(感谢@AndresF。)都是有向无环图(DAG)。意味着代码执行的可能路径是定向的(首先是this,然后是that),并且是非循环的(不形成无限循环)。它们是图,因为通过任何重要代码的路径很少像列表或树那样简单。

我在XSLT工作了大约4年。我花了很长时间来解释为什么它不是一种好的通用编程语言,但是DAG是原因。具体来说,XSLT是一种数据驱动语言。您定义了函数(是的,从函数编程的意义上来说),但是不必从代码中调用这些函数。而是,XSLT建立了对输入XML文档的节点的选择和遍历的组合。这使输入数据的结构可以确定调用哪些功能以及调用顺序。

直到程序遇到您未在凌晨2:30进行测试的数据条件并且必须唤醒并修复它之前,这非常有趣且非常酷。当您让数据定义DAG时,DAG的定义就变成了所有可能的输入条件-对于任何非平凡的业务应用程序来说,这都是无法计算的。他们是不可想象的。

起初,我认为函数式编程可能不是DAG,因为执行顺序有时不明确,甚至程序员也没有想到。但是功能程序确实定义了依赖性。实际上,可以将函数式编程的声明性视为仅定义依赖项(a ^ 2 = b ^ 2 + c ^ 2),而无需指定执行顺序('b'或'c'的平方先后无所谓) ,只要它们在加在一起之前都平方即可)。

但是,尽管函数式编程可能会故意在细节上模糊操作的顺序,但对于相关性却非常清楚。这些正是使其非常适合并发的功能。无论如何,仍然存在一个遍历代码的路径图,并且该图仍然是有方向的(必须在依赖任务之前评估依赖关系),因此我认为DAG也适用于此。

好问题-感谢您的发布!


1
您认为该命令程序是否是DAG :while (true) { print("hi"); }?也许您想排除非终止程序?
Andres F.

5

目前,DAG在编程中被低估了。从历史上看,许多与开发相关的事物都是用树和层次结构完成的,因为在盒子中移动某些事物对于我们的大脑来说很方便,使复杂的事物易于管理。但是,如果您查看事件以及它们如何依赖于其他事件和状态,那么您将获得DAG,因为我们生活和程序中的任何事物都可以依赖于过去而不是将来的任何事物,因此您将获得完美的“非周期性”关系适用于DAG概念。尽管很少在开发中明确使用它,但记住这一点将有助于更好地理解事物


2

我想知道等离子在Ecto中有什么优势...

DAG可用于按顺序对一组任务进行建模,但前提是必须先完成某些任务再执行其他任务。Ecto是一个处理框架,它使用DAG对处理图形进行建模,以便图形执行有序的同步执行。血浆中的外生是DAG和调度上运行。

在其他情况下,我们可以利用DAG的概念吗?

  • DAWG是一种数据结构,它表示一组字符串,并允许执行查询操作,以按时间与其长度成比例地测试给定字符串是否属于该组。
  • Git使用DAG进行内容存储,使用引用指针进行头部,对象模型表示和远程协议。

虽然已经很长时间了...但是我认为这个答案确实有助于我理解ecto的精神。必须指出。谢谢!
宝莱仁

0

作为一个真实的例子,我们的软件类似于IDE,最终用户可以定义要在图像上执行的一系列操作(机器视觉检查)。这些检查可以依赖于其他检查,也可以依赖于其他检查。由于这些都可以由最终用户配置,因此我们无法在设计时针对并行处理进行优化。通过将这些检查和依赖关系表示为DAG,我们可以优化整体检查的并行性,以在运行时获得最佳性能。


-1

再举一个例子,制定了Cocoa应用程序中的内存管理规则,以便所有强引用都形成一个有向无环图,这样做是为了确保不存在泄漏。


-2

添加另一个答案,因为尚未看到对构建系统的引用,例如make使用DAG找出要构建的依赖项。

在这里更多细节


我说错什么了

您跳了一个很老的问题,答案却很差。如果您很想写一个答案,那就是“添加,因为没有其他人提到它……”,并且只有一个句子,那么答案就不好了。请尝试完全回答该问题,并解释应用程序如何使用DAG,该设计如何工作以及为什么选择了其他选项。理想情况下,应包含几段内容。

好的,我稍后再详细说明
dlmeetei '16

好的,不用重复了,只是更新了一个链接,其中详细说明了该工具在make
dlmeetei

链接有过时或失败的讨厌习惯。如果发生这种情况,那么您就回到了起点-简短的单行回答并没有多大帮助。您能否总结链接的内容,以便此答案可以独立存在?(保留链接,即使没有链接,也要确保答案是正确的)。
Dan Pichelman '02
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.