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


14

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

因此,例如,如果您有一个列表(在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→(V∗I→E)

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

(1)G=(V∗EI)I

要么

G=VI∗EI∗I

(1)

G′=ln⁡(V∗EI)∗(V∗EI)I∗(ln⁡(E)∗V∗EI)

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

*如果链接断开,请引用: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/Right和edgesLeft/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+v∗G(v∗e,e)

evG

G(v)=v+v∗G(v∗e)

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

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(k−1)2]=kvk−1ek(k−1)2

Gk−1(v)=vk−1e(k−1)(k−2)2Gk′(v)=Gk−1(v)∗k∗ek−1

kk−1k−1k−1k

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(1−ve)2C+v1−ve(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.