掌桥专利:专业的专利平台
掌桥专利
首页

有向图的环路检测方法、装置、系统、设备及介质

文献发布时间:2023-06-19 12:05:39


有向图的环路检测方法、装置、系统、设备及介质

技术领域

本公开涉及计算机技术领域,尤其涉及一种有向图的环路检测方法、装置、系统、设备及介质。

背景技术

图在很多领域都有非常广泛的应用,比如金融风控领域的决策流,通过自定义地构建一系列决策节点,并使用有向图将这些决策节点组织在一起,最终形成一套有效的决策链路;再比如在某些复杂任务场景中,通过分解复杂任务,将复杂任务拆分成更小颗粒度的简单任务,并将这些简单任务构建成一个有向图,使原来的复杂任务执行流程更加具体清晰。总之,有向图几乎能用来描述所有具有流程特点的应用场景,并且是表达流程场景的一个非常优秀的解决方案。

其中,流程最大的特点就是有始有终,即不管下一步的走向如何,最终都将走到结束节点。在很多应用场景中,都不允许图中有环路存在,因为有环路存在的有向图在实际执行过程中可能会陷入死循环,从而永远都无法走到结束节点。因此,环路检测技术成为有向图研究领域中的一个重要课题。

发明内容

(一)要解决的技术问题

为解决现有技术中环路检测技术所存在的技术问题中至少之一,本公开提供了一种有向图的环路检测方法、装置、系统、设备及介质。

(二)技术方案

本公开的一方面提供了一种有向图的环路检测方法,其中,包括:根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点;将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中;以及确定环路存放集合中的链表数据为环路数据。

根据本公开的实施例,在根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点之前,该方法还包括:基于key-value数据结构规则,对有向图进行存储结构定义,实现通过key-value键值对的数据形式存储有向图。

根据本公开的实施例,在根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点之前,该方法还包括:对栈结构、链表结构和环路存放集合进行初始化,使得栈结构、链表结构和环路存放集合中的数据均为空;以及响应于初始化过程的结束,将有向图中的起始节点对应的起始二元组数据插入到栈结构中。

根据本公开的实施例,在根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点中,包括:当栈结构中的数据不为空时,对栈结构执行出栈操作,以获取对应当前节点的栈顶数据;删除链表结构中索引位置大于等于栈顶数据中的遍历层次深度的所有链表数据;以及将当前节点插入到执行删除操作之后的链表结构的末尾。

根据本公开的实施例,在根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点中,还包括:当末尾插入当前节点的链表结构中不存在重复节点数据时,移除栈结构中的栈顶数据;依据有向图的节点指向规则,查询当前节点所对应指向节点;以及当当前节点所对应的指向节点不为空时,将指向节点对应的指向二元组数据插入到移除了栈顶数据的栈结构中。

根据本公开的实施例,在将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中,包括:当末尾插入当前节点的链表结构中存在重复节点数据时,将链表结构中在遍历过程中所获取的链表数据存储至环路存放集合中。

根据本公开的实施例,在将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中,还包括:删除链表结构中最后插入的节点;以及移除栈结构中栈顶数据,以进一步判断栈结构中的数据是否为空。

根据本公开的实施例,在确定环路存放集合中的链表数据为环路数据中,包括:当栈结构中的数据为空时,确定环路存放集合中的环路数据。

本公开的另一方面提供了一种有向图的环路检测装置,其中,包括节点遍历模块、数据存储模块和环路数据确定模块。节点遍历模块用于根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点;数据存储模块用于将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中;以及环路数据确定模块用于确定环路存放集合中的链表数据为环路数据。

本公开的另一方面提供了一种有向图的环路检测系统,其中,包括:数据库和上述的装置。数据库用于存储并更新有向图的结构数据;上述的装置用于读取数据库中的结构数据,以实现上述的方法。

本公开的另一方面提供了一种电子设备,包括一个或多个处理器和存储器;存储器用于存储一个或多个程序,其中,当上述一个或多个程序被上述一个或多个处理器执行时,使得上述一个或多个处理器实现本公开实施例的方法。

本公开的另一方面提供了一种计算机可读存储介质,存储有计算机可执行指令,上述指令在被执行时用于实现本公开实施例的方法。

本公开的另一方面提供了一种计算机程序,上述计算机程序包括计算机可执行指令,上述指令在被执行时用于实现本公开实施例的方法。

(三)有益效果

本公开提供了一种有向图的环路检测方法,其中包括:根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点;将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中;以及确定环路存放集合中的链表数据为环路数据。因此,相对现有的环路检测技术,不依赖于实际场景和部署设备,适用场景更加广泛,而且能够在有限时间内,直接检测出有向图中存在的所有环路。此外,本公开还提供了一种有向图的环路检测装置、有向图的环路检测系统、电子设备及计算机可读存储介质。

附图说明

为了更完整地理解本公开及其优势,现在将参考结合附图的以下描述,其中:

图1示意性示出了根据本公开实施例的可以应用有向图的环路检测方法的示例性系统架构;

图2示意性示出了根据本公开实施例的有向图的环路检测方法的流程图;

图3示意性示出了根据本公开实施例的有向图的环路检测方法的另一流程图;

图4示意性示出了根据本公开实施例的有向图的环路检测方法的应用实例的流程图;

图5示意性示出了根据本公开实施例的有向图的环路检测方法的一有向图的组成图;

图6示意性示出了根据本公开实施例的有向图的环路检测方法的另一流程图;

图7示意性示出了根据本公开实施例的有向图的环路检测方法的另一流程图;

图8示意性示出了根据本公开实施例的有向图的环路检测方法的另一流程图;

图9示意性示出了根据本公开实施例的有向图的环路检测方法的另一有向图的组成图;

图10示意性示出了根据本公开一实施例的有向图的环路检测装置的示例性架构;

图11示意性示出了根据本公开一实施例的有向图的环路检测系统的示例性架构;

图12示意性示出了根据本公开实施例的电子设备的框图。

具体实施方式

以下,将参照附图来描述本公开的实施例。但是应该理解,这些描述只是示例性的,而并非要限制本公开的范围。在下面的详细描述中,为便于解释,阐述了许多具体的细节以提供对本公开实施例的全面理解。然而,明显地,一个或多个实施例在没有这些具体细节的情况下也可以被实施。此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本公开的概念。

在此使用的术语仅仅是为了描述具体实施例,而并非意在限制本公开。在此使用的术语“包括”、“包含”等表明了上述特征、步骤、操作和/或部件的存在,但是并不排除存在或添加一个或多个其他特征、步骤、操作或部件。

在此使用的所有术语(包括技术和科学术语)具有本领域技术人员通常所理解的含义,除非另外定义。应注意,这里使用的术语应解释为具有与本说明书的上下文相一致的含义,而不应以理想化或过于刻板的方式来解释。

在使用类似于“A、B和C等中至少一个”这样的表述的情况下,一般来说应该按照本领域技术人员通常理解该表述的含义来予以解释(例如,“具有A、B和C中至少一个的系统”应包括但不限于单独具有A、单独具有B、单独具有C、具有A和B、具有A和C、具有B和C、和/或具有A、B、C的系统等)。

附图中示出了一些方框图和/或流程图。应理解,方框图和/或流程图中的一些方框或其组合可以由计算机程序指令来实现。这些计算机程序指令可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器,从而这些指令在由该处理器执行时可以创建用于实现这些方框图和/或流程图中所说明的功能/操作的装置。本公开的技术可以硬件和/或软件(包括固件、微代码等)的形式来实现。另外,本公开的技术可以采取存储有指令的计算机可读存储介质上的计算机程序产品的形式,该计算机程序产品可供指令执行系统使用或者结合指令执行系统使用。

现有的环路检测技术多是应用在计算机网络领域,图中的每一个节点对应着网络中的一个设备,通过设备之间的通信及传递环路检测报文来识别计算机网络中是否存在环路。这种环路检测技术适用面窄,只能在网络通信领域适用,并且测量时必须保证所有网络通畅无故障。而且最大的问题是,这种检测方式无法提前在网络设计阶段就检测出网络中是否存在环路,必须要等到把设备部署到实际网络中才能检测出来。

如前述所言,有向图环路检测技术具有广泛的应用领域,而在众多实际应用场景中,有向图中不允许出现环路,环路的出现将会使执行流程陷入死循环。简单的有向图可以通过观察发现有无环路存在,但是当有向图的节点越来越多,结构越来越复杂的时候,就不可能通过观察去判断。

为解决现有技术中有向图环路检测技术所存在的技术问题中至少之一,以提供一行之有效的新型环路检测方案,使得该检测方案相对于现有的环路检测技术,能够对所有场景下的有向图进行环路检测,不依赖于实际场景和部署设备,适用面更加广泛,而且能够在最初的有向图设计阶段就检测出设计图中存在的所有环路,本公开提供了一种有向图的环路检测方法、有向图的环路检测装置、有向图的环路检测系统、电子设备及可读存储介质。

需要说明的是,本公开实施例的有向图的环路检测方法和装置可以应用于信息安全技术领域和物联网技术领域,也可以应用于除信息安全技术领域和物联网技术领域之外的任意领域,如金融服务领域,本公开实施例的有向图的环路检测方法和装置的应用领域不作具体限定。

图1示意性示出了根据本公开实施例的可以应用有向图的环路检测方法的示例性系统架构。

需要注意的是,图1所示仅为可以应用本公开实施例的应用示例,以帮助本领域技术人员理解本公开的技术内容,但并不意味着本公开实施例的有向图的环路检测方法的不可以用于其他设备、系统、环境或场景。

如图1所示,根据该实施例的系统架构100可以包括数据请求系统110,以及与该数据请求系统110建立数据通信的服务器系统120,其中服务器系统中包括与数据请求系统110建立数据传输通道的服务器M、121、122、123、124以及125,其中服务器M为主访问服务器,可以获取来自用户的指令信息。服务器121、122、123、124以及125为副访问服务器,数据请求系统110与服务器M、121、122、123、124以及125可以基于一个内部云端网络服务器C实现。或者,服务器M、121、122、123、124以及125中的主服务器M为一网络服务器时,即与其他终端设备111、112、113、114以及115的内网相对,服务器系统120的主服务器M可以位于一外网中。此时,云端网络服务器C此处用以其他终端设备111、112、113、114以及115之间提供通信链路的介质。服务器系统120与多个终端设备之间的数据传输通道具体可以通过各种通信连接类型实现,例如有线、无线通信链路或者光纤电缆等等。

需要说明的是,根据本公开实施例,服务器121、122、123、124以及125可以实现无密互联。

用户可以使用终端设备111、112、113、114以及115与服务器系统120交互,以接收或发送消息等用于实现数据传输或处理,具体涉及对服务器系统中主服务器M中的数据库的访问。例如,终端设备111向终端设备112发送业务数据,服务器系统120在接收到终端设备111的数据请求后,会对相应的业务数据执行转发处理,并在特定的需要下对业务数据进行加密,以使得最终到达终端设备112的业务数据得到安全保障。终端设备111、112、113、114以及115上可以安装有各种通讯客户端应用,例如管理类应用、网页浏览器应用、搜索类应用、即时通信工具、邮箱客户端、社交平台软件等(仅为示例)。

终端设备111、112、113、114以及115可以是具有显示屏并且支持网页浏览的各种电子设备,包括但不限于智能手机、平板电脑、膝上型便携计算机和台式计算机以及各类应用服务器等等。

服务器系统120可以包括提供各种服务的各类型防火墙,例如对用户利用终端设备111、112、113、114以及115所浏览的网站提供支持的过滤型防火墙(仅为示例)。过滤型防火墙可以对接收到的用户请求等数据进行分析等处理,并基于数据源头的地址以及协议类型等标志特征进行分析,确定是否可以通过,从而将不安全因素过滤或阻挡。

需要说明的是,本公开实施例所提供的有向图的环路检测方法一般可以由服务器系统120执行。相应地,本公开实施例所提供的有向图的环路检测装置或系统一般可以设置于服务器系统120中。本公开实施例所提供的有向图的环路检测方法也可以由不同于服务器系统120且能够与终端设备111、112、113、114以及115和/或服务器系统120通信的其他服务器系统120执行。相应地,本公开实施例所提供的有向图的环路检测装置或系统也可以设置于不同于服务器系统120且能够与终端设备111、112、113、114以及115和/或服务器系统120通信的其他服务器系统中。

应该理解,图1中的终端设备和服务器的数目仅仅是示意性的。根据实现需要,可以具有任意数目的终端设备、服务器。

以下结合图2-图12,对本公开一实施例提供的有向图的环路检测方法、有向图的环路检测装置、有向图的环路检测系统、电子设备及计算机可读存储介质作进一步的详细说明。

图2示意性示出了根据本公开实施例的有向图的环路检测方法的流程图。

如图2所示,本公开的一方面提供了一种有向图的环路检测方法,其中,包括步骤S201-S203。

在步骤S201中,根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点;

在步骤S202中,将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中;以及

在步骤S203中,确定环路存放集合中的链表数据为环路数据。

在本公开的实施例中,栈结构(stack)是一种可以应用于存储系统或数据处理系统的数据结构,一般栈结构按照后进先出的方式处理节点数据,栈结构只能在操作端操作,该操作端即为栈顶,相对另一端的非操作端则为栈底。因此,在栈结构中,只有栈顶数据可以被执行访问或读取,主要体现于栈顶数据的入栈和出栈。

链表结构(list)是另一种可以应用于存储系统或数据处理系统的数据转发结构,存储至链表结构中的数据可以依据其进入链表结构的时间、次序等特征,形成具有特定数据序列的链表数据,以使得对链表结构中的链表数据进行调取时可以依序处置。

栈结构中的栈顶数据和链表结构中的链表数据所各自存在的数据关系,如栈顶数据的有无、重复,以及链表数据的有无、重复等,以用于设定对有向图中的当前节点的指向节点的遍历。

有向图由节点和有向线段两部分组成,有向线段负责连接相邻两个节点,定义从一个节点走向另一个节点的方向,在有向图中游走的时候,只能按照有向线段的方向从一个节点走向另一个节点。其中,当起始节点走向其指向节点之后,最终又从其指向节点的指向节点指向到起始节点时,这些节点便会形成一个环路。因此,对这些节点依照节点指向次第遍历,便可以确定相应的遍历数据。

上述对节点的遍历数据被存储于链表结构中以依序形成链表数据。当遍历结束时,则可以将链表数据直接存储至环路存放集合中。环路存放集合(set)可以用于同时存放多个的链表数据,且保证所存放的多个链表数据各不相同。

每个链表数据在存放到环路存放集合中时,则形成一对应环路数据。也即环路存放集合中存放的环路数据有多少,即代表本公开实施例的检测方法所检测到的环路有多少,且各个环路数据各不相同,即能够精确地确认遍历过程中所检测的有向图的每一个环路,同时保证了检测时间具有有限性。

因此,相对现有的环路检测技术,不依赖于实际场景和部署设备,适用场景更加广泛,而且能够在有限时间内,检测出有向图中存在的所有环路。

图3示意性示出了根据本公开实施例的有向图的环路检测方法的另一流程图。

如图3所示,根据本公开的实施例,在步骤S201根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点之前,该方法还包括步骤S301。

在步骤S301中,基于key-value数据结构规则,对有向图进行存储结构定义,实现通过key-value键值对的数据形式存储有向图。

图4示意性示出了根据本公开实施例的有向图的环路检测方法的应用实例的流程图。

如图4所示,在步骤S401中,定义有向图的存储结构,使用key-value键值对的形式存储有向图,以实现有向图的参数化,将有向图以数据形式呈现表达,便于将有向图保存至存储介质中,利于有向图的数据调用。

图5示意性示出了根据本公开实施例的有向图的环路检测方法的有向图的组成图。

如图5所示有向图,有向图由节点1-5和有向线段两部分组成,有向线段负责连接相邻两个节点,定义从一个节点走向另一个节点的方向,如节点1指向节点3和节点2,且只能按照有向线段的方向从节点1指向节点3和节点2。

key-value的数据结构通过关键字和数值的对应方式,具有高可用性、高可扩展性、良好的故障恢复和运行性能,能够保证数据不易丢失、服务不易终端,且能够对故障进行感知和自动恢复优化,读写性能极高。

在本公开的实施例中,借助key-value的数据结构来保存有向图,其中,key表示一个节点的编号,value是一个list结构,里面存放的是key这个节点指向的所有其他节点,例如图5对应的有向图的key-value的存储数据如下所示:

{

“节点1”:[“节点2”,“节点3”],

“节点2”:[“节点5”],

“节点3”:[“节点4”],

“节点4”:[“节点5”],

“节点5”:[]

}

也即,一共包含5对key-value键值对,如关键字key为“节点1”,其对应value值为“节点2”和“节点3”。因此,通过上述key-value结构形式的数据存储技术,可以使用key-value结构相关的存储介质来进行持久化的有向图存储。

如图3所示,根据本公开的实施例,在步骤S201根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点之前,该方法还包括步骤S302-S303。

在步骤S302中,对栈结构、链表结构和环路存放集合进行初始化,使得栈结构、链表结构和环路存放集合中的数据均为空;以及

在步骤S303中,响应于初始化过程的结束,将有向图中的起始节点对应的起始二元组数据插入到栈结构中。

如图4所示,在步骤S402中,初始化一个空栈stack=[],一个空的链表list=[],和一个空的环路存放集合set={},其中,栈stack、链表list以及环路存放集合set中数据状态均为空。

进一步地,在步骤S403中,从有向图的起始节点node

图6示意性示出了根据本公开实施例的有向图的环路检测方法的另一流程图。

如图6所示,根据本公开的实施例,在步骤S201根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点中,包括步骤S601-S603。

在步骤S601中,当栈结构中的数据不为空时,对栈结构执行出栈操作,以获取对应当前节点的栈顶数据;

在步骤S602中,删除链表结构中索引位置大于等于栈顶数据中的遍历层次深度的所有链表数据;以及

在步骤S603中,将当前节点插入到执行删除操作之后的链表结构的末尾。

如图4所示,在步骤S404中,判断stack是否为空,如果不为空则执行步骤S405。

如图4所示,在步骤S405中,stack执行出栈操作,获得栈顶元素,即栈顶数据(node

图7示意性示出了根据本公开实施例的有向图的环路检测方法的另一流程图。

如图7所示,根据本公开的实施例,在步骤S201根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点中,还包括步骤S701-S703。

在步骤S701中,当末尾插入当前节点的链表结构中不存在重复节点数据时,移除栈结构中的栈顶数据;

在步骤S702中,依据有向图的节点指向规则,查询当前节点所对应指向节点;以及

在步骤S703中,当当前节点所对应的指向节点不为空时,将指向节点对应的指向二元组数据插入到移除了栈顶数据的栈结构中。

如图4所示,在步骤S406中,判断list中是否存在重复数据,其中,所谓重复数据为list中存在的相互重复的节点名称数据。如果list链表中不存在重复的数据,则将stack的栈顶数据移除掉,执行步骤S408。

在步骤S408中,从key-value数据结构的存储介质中查询出key=node

在步骤S409中,判断value的值是否为空。并且,如果value为空,则返回并执行步骤S404;如果value不为空,则继续执行步骤S410。

在步骤S410中,value不为空,即存在数据节点,假设value为[node1,node

图8示意性示出了根据本公开实施例的有向图的环路检测方法的另一流程图。

如图8所示,根据本公开的实施例,在步骤S202将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中,包括步骤S801。

在步骤S801中,当末尾插入当前节点的链表结构中存在重复节点数据时,将链表结构中在遍历过程中所获取的链表数据存储至环路存放集合中。

如图4所示,在步骤S406中,当判断list中存在重复数据,说明有向图中具有环路存在,则继续执行步骤S407。

在步骤S407中,将此时list中存储的链表数据放入到环路存放集合set中。

如图8所示,根据本公开的实施例,在步骤S202将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中,还包括步骤S802-S803。

在步骤S802中,删除链表结构中最后插入的节点;以及

在步骤S803中,移除栈结构中栈顶数据,以进一步判断栈结构中的数据是否为空。

参照上述步骤S406,如果list中存在重复数据,说明有向图中有环路存在,需要继续删除list中最后插入的node

此外,还需要进一步移除stack的栈顶数据,并再次执行步骤S404。

根据本公开的实施例,在步骤S203确定环路存放集合中的链表数据为环路数据中,包括:当栈结构中的数据为空时,确定环路存放集合中的环路数据。

如图4所示,在步骤S404中,当判断stack为空时,则执行步骤S411。

在步骤S411中,至此有向图的所有节点已经遍历完成,此时set集合中存放的链表数据则为被遍历的有向图中所存在的所有环路数据,有多少环路数据即代表多少环路。

为使得本领域技术人员能够对本公开实施例的有向图的环路检测方法作更进一步的理解,特举另一具体实施案例,以对上述有向图的环路检测方法作如下的详细说明:

图9示意性示出了根据本公开实施例的有向图的环路检测方法的另一有向图的组成图。

如图9所示有向图,有向图由节点1-5和有向线段两部分组成,有向线段负责连接相邻两个节点,定义从一个节点走向另一个节点的方向,如只能按照有向线段的方向从节点1指向节点3和节点2、从节点2指向节点5、从节点5指向节点4、从节点4指向节点3、从节点3指向节点5,依次形成图9所示有向图的节点指向规则。

因此,依据key-value的数据结构形式可以将上述有向图转换为key-value存储结构如下所示:

{

“1”:[“2”,“3”],

“2”:[“5”],

“3”:[“5”],

“4”:[“3”],

“5”:[“4”]

}

基于上述针对图9所示有向图的key-value数据结构的参数化存储形式(相当于如图4所示步骤S401),依据上述本公开实施例的有向图的环路检测方法对图9所示有向图中存在的所有环路执行如下检测过程:

步骤s1:从初始节点1开始,将(1,1)放入栈stack中。此时stack=[(1,1)],list=[]。其中,该步骤s1实际对应于图4所示步骤S403,关于上述步骤S402中的初始化过程不作赘述。

步骤s2:stack执行出栈操作,获得栈顶数据(1,1),将节点1插入到list中,此时stack=门,list=[1]。

步骤s3:检查list中是否包含重复数据,这里是没有包含的。从key-value存储结构中获取节点1的所有下一节点,这里为节点2和节点3,将(2,2)和(3,2)插入stack中。此时stack=[(2,2),(3,2)],list=[1]。

步骤s4:stack执行出栈操作,获得栈顶数据(3,2),将节点3插入到list中。此时stack=[(2,2)],list=[1,3]。

步骤s5:检查list中是否包含重复数据,这里没有包含。从key-value存储结构中获取节点3的所有下一节点,这里为5,将(5,3)插入stack中。此时stack=[(2,2),(5,3)],list=[1,3]。

步骤s6:stack执行出栈操作,获得栈顶数据(5,3),将节点5插入到list中。此时stack=[(2,2)],list=[1,3,5]。

步骤s7:检查list中是否包含重复数据,这里没有包含。从key-value存储结构中获取节点5的所有下一节点,这里为4,将(4,4)插入stack中,此时stack=[(2,2),(4,4)],list=[1,3,5]。

步骤s8:stack执行出栈操作,获得栈顶数据(4,4),将节点4插入到list中,此时stack=[(2,2)],list=[1,3,5,4]。

步骤s9:检查list中是否包含重复数据,这里没有包含。从key-value存储结构中获取节点4的所有下一节点,这里为3,将(3,5)插入stack中,此时stack=[(2,2),(3,5)],list=[1,3,5,4]。

步骤s10-stack执行出栈操作,获得栈顶数据(3,5),将节点3插入到list中。此时stack=[(2,2)],list=[1,3,5,4,3]。

步骤s11:检查list中是否包含重复数据,这里包含了重复数据,将list中的内容放入set中,并删除list的最后一个数据。此时set={[1,3,5,4,3]},list=[1,3,5,4],stack=[(2,2)]。

其中,上述步骤s2和s3、s4和s5、s6和s7、s8和s9对应上述图4所示步骤S405-S406-S407-S408-S409-S410-S404-S405的节点遍历过程中的循环操作,其中,步骤s2、s4、s6、s8和s10对应上述图4所示步骤S405,步骤s3、s5、s7、s9对应上述图4所示步骤S406-S407-S408-S409-S410的操作,而步骤s11则对应于步骤S406-S407的步骤,此时说明有向图中的一条环路已被检测到,且获取了该环路存放集合为set={[1,3,5,4,3]},即环路数据为[1,3,5,4,3],意味着该有向图被检测的第一条环路是1->3->5->4->3。

步骤s12:stack执行出栈操作,获得栈顶数据(2,2),这里要先从list中删除索引大于等于2的数据,再将节点2插入到list中。此时stack=[],list=[1,2]。

步骤s13:检查list中是否包含重复数据,这里没有包含。从key-value存储结构中获取节点2的所有下一节点,这里为5,将(5,3)插入stack中,此时stack=[(5,3)],list=[1,2]。

步骤s14:stack执行出栈操作,获得栈顶数据(5,3),将节点5插入到list中。此时stack=[],list=[1,2,5]。

步骤s15:检查listF中是否包含重复数据,这里没有包含。从key-value存储结构中获取节点5的所有下一节点,这里为4,将(4,4)插入stack中,此时stack=[(4,4)],list=[1,2,5]。

步骤s16:stack执行出栈操作,获得栈顶数据(4,4),将节点4插入list中。此时stack=[],list=[1,2,5,4]。

步骤s17:检查list中是否包含重复数据,这里没有包含。从key-value存储结构中获取节点4的所有下一节点,这里为3,将(3,5)插入stack中,此时stack=[(3,5)],list=[1,2,5,4]。

步骤s18:stack执行出栈操作,获得栈顶数据(3,5),将节点3插入list中。此时stack=[],list=[1,2,5,4,3]。

步骤s19:检查list中是否包含重复数据,这里没有包含。从key-value存储结构中获取节点3的所有下一节点,这里为5,将(5,6)插入stack中,此时stack=[(5,6)],list=[1,2,5,4,3]。

步骤s20:stack执行出栈操作,获得栈顶数据(5,6),将节点5插入list中。此时stack=[],list=[1,2,5,4,3,5]。

步骤s21:检查list中是否包含重复数据,这里有包含重复数据。将list中的内容放入set中,并删除list的最后一个数据,移除掉stack的栈顶数据。此时set={[1,3,5,4,3],[1,2,5,4,3,5]},list=[1,2,5,4,3],stack=[]。

类似地,上述步骤s12和s13、s14和s15、s16和s17、s18和s19对应上述图4所示步骤S405-S406-S407-S408-S409-S410-S404-S405的节点遍历过程中的循环操作,其中,步骤s12、s14、s16、s18和s20对应上述图4所示步骤S405,步骤s13、s15、s17、s19对应上述图4所示步骤S406-S407-S408-S409-S410的操作,而步骤s21则对应于步骤S406-S407的步骤,此时说明有向图中的又一条环路已被检测到,且获取的环路存放集合为set={[1,3,5,4,3],[1,2,5,4,3,5]},即此时所检测到的环路数据为[1,3,5,4,3]和[1,2,5,4,3,5],相对于上述第一条环路数据为[1,3,5,4,3],即该有向图所检测到的第二条环路是1->2->5->4->3->5。

步骤s22:由于此时栈stack为空,参照上述图4所示步骤S404-S411,结束整个遍历过程。

最后,基于对上述步骤s1-s22的有向图环路检测方法的执行过程,可以得到环路存放集合set={[1,3,5,4,3],[1,2,5,4,3,5]},说明图9所示有向图中存在两个环路,分别为1->3->5->4->3和1->2->5->4->3->5。

因此,相对于现有技术中大都只能针对网络中是否存在环路检测,或只能检测出其中一条或部分环路的环路检测技术,依据本公开实施例的环路检测方法可以在有限的时间内检测出有向图中存在的所有环路,显然,这对于精确消除有向图中的环路结构具有更加重要的实际应用意义。此外,该环路检测方法可以适用于任何能抽象为有向图的应用或者场景下的有向图检测,相比现有技术中针对特定应用或环境所提出的环路检测方法,具有更大的普适性。

图10示意性示出了根据本公开一实施例的有向图的环路检测装置的示例性架构;

本公开的另一方面提供了一种有向图的环路检测装置1000,其中,包括节点遍历模块1010、数据存储模块1020和环路数据确定模块1030。节点遍历模块1010用于根据栈结构和链表结构中的数据关系,遍历有向图中的当前节点的指向节点;数据存储模块1020用于将遍历过程中获取的链表结构中的链表数据存储至环路存放集合中;以及环路数据确定模块1030用于确定环路存放集合中的链表数据为环路数据。

其中,节点遍历模块1010、数据存储模块1020和环路数据确定模块1030分别可以用于实现如图2所示流程步骤S201、S202和S203的方法,即上述有向图的环路检测装置部分的实施例方式与有向图的环路检测方法部分的实施例方式对应类似,并且所达到的技术效果也对应类似,在此不作赘述。

需要说明的是,图10所示仅为可以应用本公开实施例的系统架构1000的示例,以帮助本领域技术人员理解本公开的技术内容,但并不意味着本公开实施例不可以用于其他设备、系统、环境或场景。

图11示意性示出了根据本公开一实施例的有向图的环路检测系统的示例性架构。

如图11所示,本公开的另一方面提供了一种有向图的环路检测系统1100,其中,包括:数据库1110和上述的有向图的环路检测装置1120。数据库1110用于存储并更新有向图的结构数据;上述的有向图的环路检测装置1120用于读取数据库中的结构数据,以实现上述的方法。

其中,上述的有向图的环路检测装置1120可以用于实现如图2所示流程步骤S201、S202和S203的方法,即上述有向图的环路检测装置1120部分的实施例方式与有向图的环路检测方法部分的实施例方式对应类似,并且所达到的技术效果也对应类似,在此不作赘述。

需要说明的是,图11所示仅为可以应用本公开实施例的系统架构1100的示例,以帮助本领域技术人员理解本公开的技术内容,但并不意味着本公开实施例不可以用于其他设备、系统、环境或场景。

如图11所示,基于上述本公开实施例所公开的应用于有向图存在的所有环路的检测方法,本公开进一步提出一有向图的环路检测系统1100,主要包括:数据库1110和环路检测装置1120。

数据库1110负责存储和维护有向图的结构数据,如上述的key-value存储数据所体现的有向图的结构数据。此外,数据库1110还用于保存和维护一集合数据,该集合数据里可以用于存放该有向图的所有起始节点(起始节点指没有被其他任何节点指向的节点)。其中,当有向图的网络结构发生变化时,数据库1110可以实现对所存储的数据结构进行适应性的数据更新。环路检测装置1120具体参见上述装置1000,主要用于负责从数据库1110中读取最新的有向图的结构数据,并据此实现上述有向图的环路检测方法,以获取被检测的有向图中存在的所有环路。

因此,无论有向图如何变化,只要其可以抽象为有向图的应用或场景,均适用于本公开上述实施例中所提出的有向图的环路检测方法,相比现有技术中针对特定应用或环境所提出的环路检测方法,具有更大的普适性。

图12示意性示出了根据本公开实施例的电子设备的框图。

本公开的另一方面提供了一种电子设备,包括一个或多个处理器和存储器;存储器用于存储一个或多个程序,其中,当上述一个或多个程序被上述一个或多个处理器执行时,使得上述一个或多个处理器实现本公开实施例的方法。

图12示意性示出了根据本公开实施例的电子设备的框图。图12示出的电子设备仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。

如图12所示,根据本公开实施例的计算机系统1200包括处理器1201,其可以根据存储在只读存储器(ROM)1202中的程序或者从存储部分1208加载到随机访问存储器(RAM)1203中的程序而执行各种适当的动作和处理。处理器1201例如可以包括通用微处理器(例如CPU)、指令集处理器和/或相关芯片组和/或专用微处理器(例如,专用集成电路(ASIC)),等等。处理器1201还可以包括用于缓存用途的板载存储器。处理器1201可以包括用于执行根据本公开实施例的方法流程的不同动作的单一处理单元或者是多个处理单元。

在RAM 1203中,存储有系统1200操作所需的各种程序和数据。处理器1201、ROM1202以及RAM 1203通过总线1204彼此相连。处理器1201通过执行ROM 1202和/或RAM 1203中的程序来执行根据本公开实施例的方法流程的各种操作。需要注意,所述程序也可以存储在除ROM1202和RAM 1203以外的一个或多个存储器中。处理器1201也可以通过执行存储在所述一个或多个存储器中的程序来执行根据本公开实施例的方法流程的各种操作。

根据本公开的实施例,系统1200还可以包括输入/输出(I/O)接口1205,输入/输出(I/O)接口1205也连接至总线1204。系统1200还可以包括连接至I/O接口1205的以下部件中的一项或多项:包括键盘、鼠标等的输入部分1206;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分1207;包括硬盘等的存储部分1208;以及包括诸如LAN卡、调制解调器等的网络接口卡的通信部分1209。通信部分1209经由诸如因特网的网络执行通信处理。驱动器1210也根据需要连接至I/O接口1208。可拆卸介质1211,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器1210上,以便于从其上读出的计算机程序根据需要被安装入存储部分1208。

根据本公开的实施例,根据本公开实施例的方法流程可以被实现为计算机软件程序。例如,本公开的实施例包括一种计算机程序产品,其包括承载在计算机可读存储介质上的计算机程序,该计算机程序包含用于执行流程图所示的方法的程序代码。在这样的实施例中,该计算机程序可以通过通信部分1209从网络上被下载和安装,和/或从可拆卸介质1211被安装。在该计算机程序被处理器1201执行时,执行本公开实施例的系统中限定的上述功能。根据本公开的实施例,上文描述的系统、设备、装置、模块、单元等可以通过计算机程序模块来实现。

本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施例中描述的设备/装置/系统中所包含的;也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被执行时,实现根据本公开实施例的方法。

根据本公开的实施例,计算机可读存储介质可以是非易失性的计算机可读存储介质,例如可以包括但不限于:便携式计算机磁盘、硬盘、随机访问存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本公开中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。例如,根据本公开的实施例,计算机可读存储介质可以包括上文描述的ROM 1202和/或RAM 1203和/或ROM 1202和RAM 1203以外的一个或多个存储器。

附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

本公开的另一方面提供了一种计算机可读存储介质,存储有计算机可执行指令,上述指令在被执行时用于实现本公开实施例的方法。

具体地,该计算机可读存储介质可以是上述实施例中描述的设备/装置/系统中所包含的;也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被执行时,实现根据本公开实施例的有向图的环路检测方法。

或者,该计算机可读存储介质可以是上述实施例中描述的设备/装置/系统中所包含的;也可以是单独存在,而未装配入该设备/装置/系统中。上述计算机可读存储介质承载有一个或者多个程序,当上述一个或者多个程序被执行时,实现根据本公开实施例的方法。

本公开的另一方面提供了一种计算机程序,上述计算机程序包括计算机可执行指令,上述指令在被执行时用于实现本公开实施例有向图的环路检测方法。

至此,已经结合附图对本公开实施例进行了详细描述。

附图中的流程图和框图,图示了按照本公开各种实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段、或代码的一部分,上述模块、程序段、或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图或流程图中的每个方框、以及框图或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。

本领域技术人员可以理解,尽管已经参照本公开的特定示例性实施例示出并描述了本公开,但是本领域技术人员应该理解,在不背离所附权利要求及其等同物限定的本公开的精神和范围的情况下,可以对本公开进行形式和细节上的多种改变。因此,本公开的范围不应该限于上述实施例,而是应该不仅由所附权利要求来进行确定,还由所附权利要求的等同物来进行限定。

以上所述的具体实施例,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 有向图的环路检测方法、装置、系统、设备及介质
  • 环路检测方法、装置、隧道端点设备及存储介质
技术分类

06120113162127