图的导数与邻接表相关吗?


14

Conor McBride的某些作品《DiffDissect》将数据类型的派生与它们的“单孔上下文类型”相关联。也就是说,如果采用该类型的派生形式,则将剩下一个数据类型,该数据类型向您显示该数据类型在任何给定点从内部看起来如何。

因此,例如,如果您有一个列表(在Haskell中)

data List a = [] | a : List a

这对应于

data List a = 1 + a * List a

通过一点数学魔术,导数是

data ListDeriv a = List a * List a

这被解释为意味着在列表中的任何一点处,左侧都会有一个列表,而右侧则有一个列表。我们可以使用派生数据结构浏览原始列表。

现在,我有兴趣对图形进行类似的操作。图的常见表示形式是一组顶点和边,它们可以通过以下数据类型来简单地实现:

data Gr a b i = Gr [(i,a)] [(i,i,b)]

如果我正确理解的话,就图索引而言,这种数据类型的派生i应该是类似的。

data GrDeriv a b i = d/di (Gr a b i)
     = d\di ( [a*i] * [b*i^2] )
     = (d\di [a*i]) * [b*i^2] ) + [a*i]*(d/di [b*i^2])
     = (a* [a*i] * [a*i]) * [b*i^2] ) 
       + [a*i] * (2*b*i) *[b*i^2]*[b*i^2])
     = InNodes { nodesLeft :: [(a,i)]
               , nodeLbl :: a
               , nodesRight :: [(a,i)]
               , edges :: [(b,i,i)] }
     | InEdges { nodes :: [(a,i)]
               , adjNode :: Either (b,i) (b,i)
               , edgesLeft :: [(b,i,i)]
               , edgesRight :: [(b,i,i)] }

我是通过将乘积规则和链规则用于派生而得到的,尽管可能会有一些错误,但它似乎遵循了一般的方案。在此结构中,您将专注于Nodes(InNodes构造函数)或Edges(在edges中),并在指定的位置看到相关的数据。

但这不是我想要的。我希望找到一种与Martin Erwigs功能图库的接口更紧密相关的构造。具体来说,我想在一个节点上看到一个表示该节点标签的上下文和两个邻接表,一个邻接表,一个邻接表。

Node a b = ([(i,b)],a,[(i,b)])

但是,我确实看到了希望,因为邻接表示法a在每个孔位置与每个边缘的邻接表示法/分解法与派生词,孤标都有一些共同点。

由于派生函数与原始函数不相同,但是派生函数的集成是(kindof),是否存在某种集成类似物可将派生函数转换为节点上下文的集合?请注意,这不是直接集成来恢复原始结构,而是一种与原始结构等效的结构,但具有更友好的算法表示形式。

如果有的话,我希望可以通过一些简单的“一组顶点和边”语言来指定关系类型结构,并且我可以派生一个高效的库来处理该结构。这样的实现方式可以用于研究“超越图论”的结构:超图,单纯形复...

所以。这个想法似乎可行吗?有用?有没有关于这种事情的研究,我可以阅读更多?

附录

G=(V,E)

G=(V,E)IVE

G=I(VIE)

我敢肯定,这可以表示为(类别理论?)

(1)G=(VEI)I

要么

G=VIEII

(1)

G=ln(VEI)(VEI)I(ln(E)VEI)

我确实认为这显示了一些希望,但我缺乏进一步发展的技巧。我知道那里必须进行进一步的探索。

*如果链接断开,请引用:Rhee,Injong等。“ DRAND:用于无线自组织网络的分布式随机TDMA调度。” IEEE Transactions on Mobile Computing 8.10(2009):1384-1396。


您提供的研究链接已失效。您能否提供更永久的链接,例如DOI或发布该期刊的期刊?
柯蒂斯F

Answers:


5

您的类型Gr并不真正对应于图,因为它包括许多实例,这些实例显然不是图,因为边缘索引不必是实际的顶点索引。

例如,

V={A,B}E={(C,D,e)}

不是图形,但允许您输入为

Gr [(1, A), (2, B)] [(3, 4, e)]

相反,您的Gr字面上对应于标记索引的列表和标记索引对的单独的,不相关的列表。这就是为什么您得到这样的“文字”派生词Gr不对应于图形中的“孔”的原因。

还有一个不幸的问题是关心顶点/边的顺序(在nodesLeft/RightedgesLeft/Right区别中可见),但是可以通过使用a Set而不是列表来解决。


这是用Haskell表示的一种类型,我认为它与(非空)图更为接近:

data Graph v e = Lone v | Joined v (Graph (v, ([e], [e])) e)

为了简单起见,我将考虑完整,简单,无向的图:

data Graph v e = Lone v | Joined v (Graph (v, e) e)

(要放松完整性,请e = Bool标记边缘存在)

请注意,这Graph是递归的(实际上是参数递归的)。这就是允许我们将类型限制为仅图形的方式,而不仅仅是将邻接表与顶点列表组合在一起的方式。

用代数写的

G(v,e)=v+vG(ve,e)

evG

G(v)=v+vG(ve)

通过反复扩展,我们得到了固定点

G(v)=v1e(12)+v2e(22)+v3e(32)+v4e(42)+

这很有意义,因为(完整)图是

  • 一个顶点,没有边
  • 两个顶点和一个边
  • 三个顶点和三个边
  • 四个顶点和四个选择2 = 6条边
  • ....

kGk(v)=vke(k2)G(v)=G1(v)+G2(v)+

具有导数

ddvG(v)=i=1Gi(v)

Gk(v)=ddv[vkek(k1)2]=kvk1ek(k1)2

Gk1(v)=vk1e(k1)(k2)2Gk(v)=Gk1(v)kek1

kk1k1k1k

data SimpleGraph v e = Lone v | Joined v (SimpleGraph (v, e) e)

data SimpleGraphHole v e = Empty
                         | InsertLater v (SimpleGraphHole (v, e) e)
                         | InsertHere (SimpleGraph (v, e) e)

该图中的定单

此版本的Graph数据结构从根本上讲是一个链表,因此它对顶点的顺序进行编码。虽然可以使用Set在邻接列表版本中解决此问题,但在这里并不是那么直接。

我认为您可以修改树数据结构以进行相同类型的参数递归,而根起“ head”的作用SimpleGraph。通过生成的树集的界面,顺序/基础结构变得不可见(如果您对快速更新不感兴趣,甚至可以是规范的)。

您建议的衍生品

您提出了派生类型;我将进行更改,以使标签和索引像我一样:([(v,e)], [(v,e)])

1(1ve)2C+v1ve(v, [(v, e)])

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.