数据结构
数据 相邻地图a b来源 #
这个相邻地图
数据类型表示无向二分图表。这两个类型参数决定了每个零件的顶点类型。如果类型一致,左侧部分的顶点仍被视为不相交从右侧的顶点开始。有关更多详细信息,请参见示例。
我们定义了一个号码
实例作为使用bipartial的方便符号图:
0 ==right顶点
0互换
1 ==left顶点
1互换
1 + 2 ==顶点
[1] [2]互换
1 * 2 ==边缘
1 2互换
1 + 2 *互换
3 ==覆盖
(left顶点
1) (边缘
3 2)互换
1 * (2 +互换
3) ==连接
(左顶点
1) (顶点
[3] [2])
注:这个号码
实例不符合以下几个“习惯法”号码
,这就决定了from整数
0
和from整数
1
应作为加法和乘法恒等式,以及否定
作为加法逆。尽管如此,超载from整数
,+
和*
在以下情况下非常方便使用代数图;我们希望将来哈斯克尔的前奏曲会为代数结构提供更精细的类层次结构,我们可以在不违反任何法律的情况下使用。
这个显示
实例是使用基本图形构造原语定义的:
show empty==“空”显示1==“rightVertex 1”显示(互换
2) ==“leftVertex 2”显示(1+2)==“顶点[][1,2]”显示(互换
(1+2))==“顶点[1,2][]”表演(互换
1*2)==“边缘12”显示(互换
1 * 2 *互换
3) ==“边[(1,2),(3,2)]”表演(互换
1 * 2 +互换
3) ==“覆盖(左顶点3)(边1 2)”
这个等式
实例满足无向二部代数图的所有公理:
覆盖
是可交换和关联的:
x+y==y+xx+(y+z)==(x+y)+z
连接
是交换的、结合的,并且具有空的
作为身份:
x*空==x空*x==xx*y==y*xx*(y*z)==(x*y)*z
连接
分布在覆盖
:
x*(y+z)==x*y+x*z(x+y)*z==x*z+y*z
连接
可以分解为:
x*y*z==x*y+x*z+y*z
连接
具有与相同的效果覆盖
在同一零件的顶点上:
left顶点x*left顶点y==left顶点x+left顶点yrightVertex x*rightVertes y==rightVerte x+rightVertix y
从上述公理集可以证明以下有用的定理。
覆盖
有空的
作为恒等式,并且是幂等的:
x+空==x空+x==xx+x==x
吸收和饱和连接
:
x*y+x+y==x*yx*x*x==x*x
在指定图形算法的时间和内存复杂性时,n个和米将分别表示图形的顶点数和边数。在此外,我和第页将表示左侧和右侧的顶点数图的各个部分。
基本图构造原语
转换函数
图形属性
边缘列表::相邻地图a b->[(a,b)]来源 #
图形的边的排序列表。复杂性:O(n+m)时间和O(米)内存。
边缘列表空的
== []边缘列表(顶点
x) ==[]边缘列表(边缘
x y)==[(x,y)]边缘列表。边缘
==节点
.分类
left相邻列表::相邻地图a b->[(a,[b])]来源 #
已排序的邻接列表图的左侧部分。复杂性:O(n+m)时间和记忆。
left相邻列表空的
== []左相邻列表(顶点
[]xs)==[]left相邻列表(顶点
xs[])==[(x,[])|x<-节点
(分类
x)]left相邻列表(边缘
x y)==[(x,[y])]left相邻列表(明星
x-ys)=[(x,节点
(分类
年)]
右侧相邻列表::相邻地图a b->[(b,[a])]来源 #
已排序的邻接列表图的右侧部分。复杂性:O(n+m)时间和记忆。
右侧相邻列表空的
== []右侧相邻列表(顶点
[]xs)==[(x,[])|x<-节点
(分类
x)]右侧相邻列表(顶点
xs[])==[]右侧相邻列表(边缘
x y)==[(y,[x])]右侧相邻列表(明星
x y)==[(y,[x])|y<-节点
(分类
年)]
标准图形族
数据 列表a b来源 #
两种交替类型的值列表。第一个类型参数表示头部值的类型。
使用过载列表
扩展-可以使用标准列表构造符号列表
两种类型重合,例如:
[1,2,3,4,5]::列出Int Int
在下面的例子中,我们使用了这个简写符号。
事件列表::[(a,b)]->列表a b来源 #
构造一个列表
从配对列表中选择偶数长度的。
事件列表[]==无
evenList[(1,2),(3,4)]==[1,2,3,4]:列表
利息-利息evenList[(1,'a'),(2,'b')]==欺骗
1个(欺骗
“a”(欺骗
2 (欺骗
“b”无
)))
oddList(古怪列表)::a->[(b,a)]->列表a b来源 #
构造一个列表
给定第一个元素和一个对列表,长度为奇数。
oddList 1[]==欺骗
1无
oddList 1[(2,3),(4,5)]==[1,2,3,4,5]:列表
利息-利息oddList 1[('a',2),('b',3)]==欺骗
1个(欺骗
“a”(欺骗
2 (欺骗
“b”(欺骗
三无
))))
电路:: (订单a、,订单b) =>[(a,b)]->相邻地图a b来源 #
这个电路在顶点对列表中。复杂性:O(L*log(L))时间,其中L是给定列表的长度。
电路[]==空的
电路[(x,y)]==边缘
x年电路[(1,2),(3,4),(5,6)]==边缘
[(1,2), (3,2), (3,4), (5,4), (5,6), (1,6)]电路。颠倒
==互换
.电路。地图
数据。塔普。互换
二液化:: (订单a、,订单b) =>【a】->【b】->相邻地图a b来源 #
这个二液化在两个顶点列表上。复杂性:O(n*log(n)+m)时间和O(n+m)内存。
比克[][]==空的
双液xs[]==顶点
xs[]双液[]ys==顶点
[]年双液xs-ys==连接
(顶点
xs[])(顶点
[]年)
明星:: (订单a、,订单b) =>a->[b]->相邻地图a b来源 #
这个明星由连接到叶子列表的中心顶点形成。复杂性:O(L*log(L))时间,其中L(左)是给定列表的长度。
星x[]==left顶点
x个星x[y]==边缘
x年星形x[y,z]==边缘
[(x,y),(x,z)]星形x y==连接
(left顶点
x)(顶点
[]年)
网格:: (订单a、,订单b) =>【a】->【b】->相邻地图(a、b)(a、b)来源 #
构造一个网格两个顶点列表中的图形。复杂性:O(L1*L2*日志(L1*L1))时间,其中第一层和二级是给定列表的长度。
网格xs[]==空的
网格[]ys==空的
网格[x][y]==left顶点
(x,y)网格[1,1]['a','b']==二液化
[(1,‘a’),(1,'b')]网格[1,2]['a','b']==二氯二苯醚
[(1,'a'),(2,'b')]
图形转换
图形组成
箱:: (订单a、,订单b) =>相邻地图a a->相邻地图b b->相邻地图(a、b)(a、b)来源 #
计算笛卡尔积两张图中的一张。复杂性:O((n+m)*log(n))时间和O(n+m)内存。
箱
(路径
[0,1])(路径
[‘a’,‘b’])==边缘
[((0,'a'),(0,'b')),(0,'a'),(1,'a]),(1,‘b’),(0,‘b'),((1,‘b’),(1,’a’)]
直到结果顶点类型之间的同构,此操作是可交换的,相联的,分发结束覆盖
,具有单例图形为身份和交换身份、和空的
作为零化.下方~~
代表平等直至同构,例如(x,
()~~x
.
框x y ~~框y x盒子x(盒子yz)~~盒子(盒子xy)z方框x(覆盖
y z)==覆盖
(方框x y)(方框x z)方框x(left顶点
()~~x方框x(right顶点
()) ~~互换
x个方框x空的
~~空的
顶点计数
(方框x y)==顶点计数
x个*顶点计数
年边缘计数
(方框x y)==顶点计数
x个*边缘计数
年+边缘计数
x个*顶点计数
年
盒子带有:: (订单a、,订单b、,订单c、,订单日期:,订单e、,订单f) =>(a->c->e)->(b->d->e)->(a->d->f)->(b->c->f)->相邻地图a b->相邻地图c d->相邻地图e、f来源 #
计算概括笛卡尔积两张图中的一张。产生的结果使用给定的顶点组合器获得顶点。复杂性:O((n+m)*log(n))时间和O(n+m)内存。
请参阅箱
例如。
框==框带有(,)(,)
其他