DAG的不可变数据结构?

时间:2018-01-14 22:31:05

标签: scala data-structures functional-programming immutability directed-acyclic-graphs

我正在寻找一种我在可变程序中使用的数据结构的不可变替代方法。 (见this article,见图4)。它是一个DAG,每个节点有两个指针。基本原理是我们有多个集合,每个元素都是两个集合的一部分,每个集合都有一个到其后继者的链接。因此,该结构允许我们遍历每个集合的元素,就像我们每个集合的链接列表一样。

Exotic two-watched literals data structure

链接列表在功能性和不可变的世界中很受欢迎,但是双向列表提供了很大的实现挑战。据说你可以用懒惰来实现它们,至少在某些语言中是这样,但是如果Scala程序员有一个序列,其中元素将被经常删除或插入到中间,那么你可能会更好地使用{{ 1}}。

要使用可变性从此数据结构中删除元素,您只需找到元素的两个前驱,并替换相应后继后继的后继。

在不可变的单链表中执行此操作会强制我们重建所有前任,我们可能决定支付的价格,或使用Vector懒惰地删除元素。但是对于这里的数据结构,我们现在必须从节点重建两个前驱,对于它所属的两个集合,以及它们所有集合中的所有前任前辈!

我发现这是一个非常有趣的数据结构示例,它对不可变设计提出了巨大的挑战,我很想知道现在:实现这个数据结构的一个好的功能,不可变的持久方式是什么?在设计稀疏矩阵的数据结构时可能面临类似的挑战(如DLX所示)。

到目前为止,我能想出的最好的方法就是找到存储在Stream中的邻接列表。这是解决这个问题的最佳方法,坚持不变性吗?或者我们可以将这个奇怪的DAG列表变成一棵树吗?...我经常听到手指树可以解决任何问题,在这种情况下我们是否有机会使用它们?

0 个答案:

没有答案