代数图-0.7:代数图构造和转换库
版权所有(c) 安德烈·莫霍夫2016-2022
许可证MIT(请参阅文件LICENSE)
维护人员andrey.mokhov@gmail.com
稳定性实验的
安全哈斯克尔
语言哈斯克尔2010

代数。图表。二分的。相邻地图

说明

阿尔加是用于图的代数构造和操作的库在哈斯克尔。请参阅这篇论文对于图书馆背后的动机、基础理论和实施细节。

本模块定义了相邻地图无向二部的数据类型图形和相关函数。请参阅代数。图表。二分的。相邻地图。算法基本二部图算法。

避免名称与冲突代数。图表。相邻地图,此模块可以是进口合格:

导入合格的代数。图表。二分的。作为二部的AdjacencyMap
简介

数据结构

数据 相邻地图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整数 0from整数 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) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

(订单a、,订单b、,号码b) =>号码(相邻地图a b) 来源 #

注:这不满足通常的环定律;看见相邻地图了解更多详细信息。

实例详细信息

定义于代数。图表。二分的。相邻地图

(订单a、,订单b) =>订单(相邻地图a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

(订单a、,订单b、,显示a、,显示b) =>显示(相邻地图a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

通用(相邻地图a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

关联的类型

类型 代表(相邻地图a b):类型->类型 #

(订单a、,订单b) =>半群(相邻地图a b) 来源 #

通过定义覆盖.

实例详细信息

定义于代数。图表。二分的。相邻地图

(订单a、,订单b) =>单体(相邻地图a b) 来源 #

通过定义覆盖空的.

实例详细信息

定义于代数。图表。二分的。相邻地图

类型 代表(相邻地图a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

类型 代表(相邻地图a b)=第1页('元数据“AdjacencyMap”“代数.图.二部.邻接图”“代数-图-0.7-DxCmXygYU3a8wvsz565Q5f”“”False(错误)) (C1类('MetaCons公司“BAM”前缀I'真的) (S1(第一阶段)('MetaSel(元选择)('只是“leftAdjacencyMap”)'无源未打包'无源严格性'决定懒惰) (0级可采收水平(地图一个(设置b) )):*: S1(第一阶段)('MetaSel(元选择)('只是“rightAdjacencyMap”)'无源未打包'无源严格性'决定懒惰) (接收0(地图b(设置a) )))

左侧相邻地图::相邻地图a b->地图一个(设置b)来源 #

这个邻接图图的左侧:每个左顶点与一组右邻右舍相关。复杂性:O(1)时间和记忆。

左侧相邻地图空的==地图。空的左侧相邻地图(left顶点x) ==地图。单子x套。空的左侧相邻地图(右侧顶点x) ==地图。空的左侧相邻地图(边缘x y)==地图。单子x(套。单子年)

右侧相邻地图::相邻地图a b->地图b(设置a)来源 #

这个邻接图图的右侧:每个右顶点与一组左邻右舍关联。复杂性:O(1)时间和记忆。

右侧相邻地图空的==地图。空的右侧相邻地图(left顶点x) ==地图。空的右侧相邻地图(right顶点x) ==地图。单子x套。空的右侧相邻地图(边缘x y)==地图。单子y(设置。单子x)

基本图构造原语

空的::相邻地图a b来源 #

构造空图形.

栈空空==真左侧相邻地图空==映射。空的
右侧相邻地图空==映射。空的
hasVertex公司x空==假

left顶点::a->相邻地图a b来源 #

构建包含以下内容的图形单个孤立顶点在左侧。

左侧相邻地图(leftVertex x)==贴图。单子x套。空的
右侧相邻地图(leftVertex x)==贴图。空的
hasLeftVertex(左顶点)x(左顶点y)==(x==y)具有右顶点x(左顶点y)==假hasEdge公司x y(leftVertex z)==假

right顶点::b->相邻地图a b来源 #

构建包含以下内容的图形单个孤立顶点在右边。

左侧相邻地图(rightVertex x)==贴图。空的
右侧相邻地图(rightVertex x)==贴图。单子x套。空的
hasLeftVertex(左顶点)x(右顶点y)==假具有右顶点x(右顶点y)==(x==y)hasEdge公司x y(右顶点z)==假

顶点::要么a b->相邻地图a b来源 #

构建包含以下内容的图形单个孤立顶点.

顶点。左侧==左顶点顶点。右侧==right顶点

边缘::a->b->相邻地图a b来源 #

构建包含以下内容的图形单边.

边缘x y==连接(left顶点x)(right顶点年)左侧相邻地图(边x y)==贴图。单子x(套。单子年)右侧相邻地图(边x y)==贴图。单子y(设置。单子x)hasEdge公司x y(边x y)==真hasEdge公司1 2(边缘2 1)==假

覆盖:: (订单a、,订单b) =>相邻地图a b->相邻地图a b->相邻地图a b来源 #

覆盖两张图。这是一个交换的、结合的和幂等的具有标识的操作空的.复杂性:O((n+m)*log(n))时间和O(n+m)内存。

栈空(覆盖x y)==栈空x个&&栈空has顶点z(覆盖x y)==hasVertex公司z x轴||hasVertex公司z y(z y)顶点计数(覆盖x y)>=顶点计数x个顶点计数(覆盖x y)<=顶点计数x个+顶点计数边缘计数(覆盖x y)>=边缘计数x个边缘计数(覆盖x y)<=边缘计数x个+边缘计数

连接:: (订单a、,订单b) =>相邻地图a b->相邻地图a b->相邻地图a b来源 #

连接两个图,过滤掉相同顶点之间的边部分。这是一个与恒等式的交换和关联操作空的,分布在覆盖并遵循分解公理。复杂性:O((n+m)*log(n))时间和O(n+m)内存。请注意结果图中的边数与参数中的顶点数:O(m1+m2+l1*r2+l2*r1).

连接(left顶点x)(left顶点年)==顶点[x,y][]连接(left顶点x)(right顶点年)==边缘x年连接(right顶点x)(left顶点年)==边缘年x连接(right顶点x)(right顶点年)==顶点[][x,y]连接(顶点xs1 ys1)(顶点xs2 ys2)==覆盖(二液化xs1 ys2)(二液化xs2 ys1)栈空(连接x y)==栈空x个&&栈空hasVertex公司z(连接x y)==hasVertex公司z x轴||hasVertex公司z y方向顶点计数(连接x y)>=顶点计数x个顶点计数(连接x y)<=顶点计数x个+顶点计数边缘计数(连接x y)>=边缘计数x个边缘计数(连接x y)>=左侧顶点计数x个*右侧顶点计数边缘计数(连接x y)<=左侧顶点计数x个*右侧顶点计数年+右侧顶点计数x个*左侧顶点计数年+边缘计数x+边缘计数

顶点:: (订单a、,订单b) =>【a】->【b】->相邻地图a b来源 #

构建包含每个独立顶点的给定列表的图部分。复杂性:O(L*log(L))时间和O(左)内存,其中L(左)是总数两个列表的长度。

顶点[][]==空的顶点[x][]==left顶点x个顶点[][x]==right顶点x个顶点xs-ys==覆盖层(地图 left顶点X轴++地图 右侧顶点年)hasLeftVertex(左顶点)x(顶点xs-ys)==元素x xs具有右顶点y(顶点xs-ys)==元素是的,是的

边缘:: (订单a、,订单b) =>[(a,b)]->相邻地图a b来源 #

从边列表构造图形。复杂性:O((n+m)*log(n))时间和O(n+m)内存。

边[]==空的边[(x,y)]==边缘x年边缘==覆盖层.地图(未修剪的 边缘)hasEdge公司x年。边缘==元素(x,y)边缘计数.边缘==长度.节点

覆盖层:: (订单a、,订单b) =>[相邻地图a b]->相邻地图a b来源 #

覆盖给定的图形列表。复杂性:O((n+m)*log(n))时间和O(n+m)内存。

覆盖[]==空的覆盖[x]==x覆盖[x,y]==覆盖x年覆盖层==折叠器 覆盖 空的
栈空.覆盖层==全部的 栈空

连接:: (订单a、,订单b) =>[相邻地图a b]->相邻地图a b来源 #

连接给定的图表列表。复杂性:O((n+m)*log(n))时间和O(n+m)内存。

连接[]==空的连接[x]==x连接[x,y]==连接x y连接==文件夹 连接 空的
栈空.连接==全部的 栈空

互换::相邻地图a b->相邻地图b和a来源 #

交换给定图形的各个部分。复杂性:O(1)时间和记忆。

互换空的==空的掉期。left顶点==right顶点互换(顶点xs-ys)==顶点年-月互换(边缘x年)==边缘年x掉期。边缘==边缘.地图数据。塔普。互换掉期。互换==身份证件

转换函数

二分之一:: (订单a、,订单b) =>相邻地图(要么a b)->相邻地图a b来源 #

构造一个二分体相邻地图来自代数。图表。相邻地图,添加任何缺少的边以使图形无向,并过滤掉相同零件内的边缘。复杂性:O(m*log(n)).

二分之一空的==空的二分之一(顶点(左x)==left顶点x个二分之一(顶点(右x)==right顶点x个二分之一(边缘(左x)(左y))==顶点[x,y][]二分之一(边缘(左x)(右y))==边缘x年二分之一(边缘(右x)(左y))==边缘年x二分之一(边缘(右x)(右y))==顶点[][x,y]二方。集团==未修剪的 二液化.分区或其他二方。来自二分体==身份证件

至两党:: (订单a、,订单b、,订单c) =>(a->要么b c)->相邻地图a->相邻地图b c类来源 #

构造一个二分体相邻地图来自代数。图表。相邻地图,其中两个部分由单独的函数标识,添加任何缺少的边使图形无向并过滤掉相同的部件。复杂性:O(m*log(n)).

与f组成两部分空的==空的toBipartite带左x==顶点(顶点列表x) []toBipartite With Right x(带右x的双部分)==顶点[] (顶点列表x)与f组成两部分==二分之一.gmap(gmap)如果使用id创建双部分==二分之一

来自二分体:: (订单a、,订单b) =>相邻地图a b->相邻地图(要么a b)来源 #

构造一个代数。图表。相邻地图从两党相邻地图.复杂性:O(m*log(n)).

来自二分体空的==空的来自二分体(left顶点x)==顶点(左x)来自Bipartite(边缘x年)==边缘[(左x,右y),(右y,左x)]二分之一.来自二部==身份证件

来自BipartiteWith::订单c=>(a->c)->(b->c)->相邻地图a b->相邻地图c(c)来源 #

构造一个代数。图表。相邻地图从两党相邻地图给出了将两个部分的顶点注入结果顶点的方法类型。复杂性:O(m*log(n)).

fromBipartite随以左右==来自二分体来自id为的Bipartite(顶点xs-ys)==顶点(xs++ys)来自id为的Bipartite。边缘==对称闭合.边缘

图形属性

栈空::相邻地图a b->布尔 来源 #

检查图形是否为空。复杂性:O(1)时间。

栈空空的==正确是空的(覆盖 空的 空的)==正确是空的(顶点x) ==错误isEmpty==(==)空的

hasLeftVertex(左顶点)::订单a=>a->相邻地图a b->布尔 来源 #

检查图的左侧部分是否包含给定的顶点。复杂性:O(对数(l))时间。

hasLeftVertex x(左顶点x)空的==错误hasLeftVertex x(左顶点x)(left顶点y) ==(x==y)hasLeftVertex x(左顶点x)(right顶点y) ==错误

具有右顶点::订单b=>b->相邻地图a b->布尔 来源 #

检查图形的右侧是否包含给定的顶点。复杂性:O(对数(r))时间。

具有右顶点x空的==错误具有右顶点x(left顶点y) ==错误具有右顶点x(right顶点y) ==(x==y)

hasVertex公司:: (订单a、,订单b) =>要么a b->相邻地图a b->布尔 来源 #

检查图形是否包含给定的顶点。复杂性:O(对数(n))时间。

hasVertex。左侧==hasLeft顶点hasVertex。右侧==具有右顶点

hasEdge公司:: (订单a、,订单b) =>a->b->相邻地图a b->布尔 来源 #

检查图形是否包含给定边。复杂性:O(对数(n))时间。

hasEdge x y轴空的==错误hasEdge x y轴(顶点z) ==错误hasEdge x y轴(边缘x y)==真hasEdge x y轴==元素(x,y)。边缘列表

左侧顶点计数::相邻地图a b->国际 来源 #

图形左侧的顶点数。复杂性:O(1)时间。

左侧顶点计数空的== 0左侧顶点计数(left顶点x) ==1左侧顶点计数(right顶点x) ==0左侧顶点计数(边缘x y)==1leftVertexCount。边缘==长度.节点.地图 有限状态试验

右侧顶点计数::相邻地图a b->国际 来源 #

图形右侧的顶点数。复杂性:O(1)时间。

右侧顶点计数空的== 0右侧顶点计数(left顶点x) ==0右侧顶点计数(right顶点x) ==1右侧顶点计数(边缘x y)==1right顶点计数。边缘==长度.节点.地图 信噪比

顶点计数::相邻地图a b->国际 来源 #

图中的顶点数。复杂性:O(1)时间。

顶点计数空的== 0顶点计数(顶点x) ==1顶点计数(边缘x y)==2顶点计数x==左侧顶点计数x个+右侧顶点计数x个

边缘计数::相邻地图a b->国际 来源 #

图中的边数。复杂性:O(l)时间。

边缘计数空的== 0边缘计数(顶点x) ==0边缘计数(边缘x y)==1边缘计数。边缘==长度.节点

左侧顶点列表::相邻地图a b->[a]来源 #

图左侧顶点的排序列表。复杂性:O(1)时间和记忆。

左侧顶点列表空的== []左顶点列表(left顶点x) ==[x]左侧顶点列表(right顶点x) ==[]leftVertexList。翻转 顶点[] ==节点.分类

右侧顶点列表::相邻地图a b->[b]来源 #

图右侧顶点的排序列表。复杂性:O(r)时间和记忆。

右侧顶点列表空的== []右侧顶点列表(left顶点x) ==[]右侧顶点列表(right顶点x) ==[x]右顶点列表。顶点[]   ==节点.分类

顶点列表::相邻地图a b->[要么a b】来源 #

图的顶点的排序列表。复杂性:O(n)时间和记忆

顶点列表空的== []顶点列表(顶点x) ==[x]顶点列表(边缘x y)==[左x,右y]顶点列表(顶点(左翼X轴)(权利xs))==节点(分类X轴)

边缘列表::相邻地图a b->[(a,b)]来源 #

图形的边的排序列表。复杂性:O(n+m)时间和O(米)内存。

边缘列表空的== []边缘列表(顶点x) ==[]边缘列表(边缘x y)==[(x,y)]边缘列表。边缘==节点.分类

left顶点集::相邻地图a b->设置来源 #

图左部分的顶点集。复杂性:O(1)时间和记忆。

left顶点集空的==设置。空的leftVertexSet。left顶点==设置。单子leftVertexSet。right顶点==常数设置。空的leftVertexSet。轻弹 顶点[]==设置。从列表

right顶点集::相邻地图a b->设置b来源 #

图右部分的顶点集。复杂性:O(r)时间和记忆。

right顶点集空的==设置。空的right顶点集。left顶点==常数设置。空的右顶点集。right顶点==设置。单子right顶点集。顶点[]==设置。从列表

顶点集:: (订单a、,订单b) =>相邻地图a b->设置(要么a b)来源 #

图的顶点集。复杂性:O(n)时间和记忆。

顶点集空的==设置。空的顶点集。顶点==设置。单子顶点集(边缘x y)==设置。从列表[左x,右y]顶点集(顶点(左翼X轴)(权利xs))==设置。来自列表X轴

边缘设置:: (订单a、,订单b) =>相邻地图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

在下面的例子中,我们使用了这个简写符号。

建造师

 
欺骗一个(列表b a) 

实例

实例详细信息
IsList(IsList)(列表a a) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

关联的类型

类型 项目(列表a a)#

(等式a、,等式b) =>等式(列表a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

方法

(==)::列表a b->列表a b->布尔 #

(/=)::列表a b->列表a b->布尔 #

(订单a、,订单b) =>订单(列表a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

(显示a、,显示b) =>显示(列表a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

通用(列表a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

关联的类型

类型 代表(列表a b):类型->类型 #

方法

::列表a b->代表(列表a b)x#

::代表(列表a b)x->列表a b#

类型 代表(列表a b) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

类型 项目(列表a a) 来源 # 
实例详细信息

定义于代数。图表。二分的。相邻地图

类型 项目(列表a)=a

事件列表::[(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[]==欺骗1oddList 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个)          ==left顶点x个路径(欺骗x个(欺骗)) ==边缘x年路径[1,2,3,4,5]==边缘[(1,2), (3,2), (3,4), (5,4)]

电路:: (订单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来源 #

这个星星通过覆盖列表形成明星第条。复杂性:O(L*log(L))时间,其中L(左)是输入的总大小。

星形[]==空的星星[(x,[])]==left顶点x个星星[(x,[y])]==边缘x年星星[(x,ys)]==明星x年星星==覆盖层.地图(未修剪的 明星)覆盖(星星xs)(星星ys)==星星(xs++ys)

网格:: (订单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=>a->相邻地图a b->相邻地图a b来源 #

从给定图形的左侧删除顶点。复杂性:O(r*log(l))时间。

删除左顶点x(left顶点x)==空的删除左顶点1(left顶点2)       ==left顶点2移除左顶点x(right顶点年)==right顶点删除左顶点x(边缘x年)==right顶点删除左顶点x。removeLeftVertex x==removeLeftVertex x

删除右顶点::订单b=>b->相邻地图a b->相邻地图a b来源 #

从给定图形的右侧部分移除顶点。复杂性:O(l*log(r))时间。

移除右顶点x(right顶点x)==空的删除右顶点1(right顶点2)       ==right顶点2移除右顶点x(left顶点年)==left顶点移除右顶点y(边缘x年)==left顶点x个移除右顶点x。removeRightVertex x==removeRightVertex x

删除边缘:: (订单a、,订单b) =>a->b->相邻地图a b->相邻地图a b来源 #

从给定图形中删除边。复杂性:O(对数(l)+对数(r))时间。

删除边缘x y(边缘x年)==顶点[x] [年]移除边缘x y。removeEdge x y==删除边缘x y移除边缘x y。删除左顶点x个==删除左顶点x个移除边缘x y。删除右顶点年==删除右顶点

双地图:: (订单a、,订单b、,订单c、,订单d) =>(a->c)->(b->d)->相邻地图a b->相邻地图抄送来源 #

通过对每个部分的顶点应用给定的函数来变换图形。复杂性:O((n+m)*log(n))时间。

双映射f g空的==空的bimap f g。顶点==顶点。数据。双函子。双地图f克双映射f g(边缘x年)==边缘(f x)(g y)双地图身份证件 身份证件==身份证件bimap f1 g1。bimap f2 g2==bimap(f1.f2)(g1.g2)

图形组成

:: (订单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)内存。

请参阅例如。

框==框带有(,)(,)

其他

一致的:: (订单a、,订单b) =>相邻地图a b->布尔 来源 #

检查内部图形表示是否一致,即中存在的边左侧相邻地图也存在于右侧相邻地图地图。不可能创建不一致的邻接图,我们在测试中使用这个函数。

一致的空的==正确一致的(顶点x) ==正确一致的(边缘x y)==真一致的(边缘x) ==正确一致的(二分之一x) ==正确一致的(互换x) ==正确一致的(电路x) ==正确一致的(二液化x y)==真