一种基于迭代的图搜索方法与流程

文档序号:16783458发布日期:2019-02-01 19:17阅读:193来源:国知局
一种基于迭代的图搜索方法与流程

本发明涉及计算机技术领域,具体涉及一种基于迭代的图搜索方法。



背景技术:

在关系网络的应用场景中,通常需要对某个节点的关系链进行分析,尤其在大数据的应用中。

现有技术中提供的图搜索方法主要基于递归实现,即通过函调用自身的算法,并在该算法执行过程中需要采用递归的方式多次判断退出的条件,当该条件满足时,即遍历完成,算法退出。

由于现有技术基于递归实现图搜索,而递归是重复调用函数自身实现的循环,因此常常造成方法的栈溢出。即函数调用是通过栈实现的,递归方式调用图搜索需要递归调用自身方法,相当于持续的调用方法,而且不能释放栈,当调用深度足够深时,栈空间不足就会造成栈溢出。



技术实现要素:

本发明的目的在于提供一种基于迭代的图搜索方法,用于提高图搜索的效率。

为了达到上述目的,本发明采用这样的如下技术方案:

本发明提供一种基于迭代的图搜索方法,包括:

将图数据库中的第一节点加入到队列中,所述图数据库中包括网络图中的n个节点,其中,所述第一节点属于所述n个节点中的一个节点,所述n个节点中存在通过连边相连接的至少两个节点,所述n为正整数;

以所述第一节点作为父节点遍历所述图数据库,从所述图数据库中搜索出第二节点,其中,所述第二节点属于所述n个节点中的一个节点,所述第一节点与所述第二节点之间存在连边,且所述第二节点是没有被标记为已处理的节点;

将所述第二节点加入到所述队列中,并将所述第一节点标记为已处理的节点;

将所述第一节点从所述队列中弹出,判断所述队列中的所有节点是否被弹出,若还存在没有被弹出的节点,将所述队列中还剩余的节点作为父节点重新搜索所述图数据库,并搜索到新的节点之后更新所述队列,直至所述队列中的所有节都被弹出,结束图搜索流程。

采用上述技术方案后,本发明提供的技术方案将有如下优点:

在本发明实施例中,首先将图数据库中的第一节点加入到队列中,然后以第一节点作为父节点遍历图数据库,在第一节点与第二节点之间存在连边,且第二节点是没有被标记为已处理的节点的情况下,该第二节点作为从图数据库中搜索出的节点,接下来将第二节点加入到队列中,并将第一节点标记为已处理的节点,最后将第一节点从队列中弹出,判断队列中的所有节点是否被弹出,若还存在没有被弹出的节点,将队列中还剩余的节点作为父节点重新搜索图数据库,并搜索到新的节点之后更新队列,直至队列中的所有节都被弹出,结束图搜索流程。本发明实施例中使用队列来管理图数据库中的节点,并对该队列中的节点进行插入和弹出的管理控制,从而通过以父节点的身份遍历图数据库的方式,使得图数据库中存在父子关系的节点都被插入到队列中,本发明实施例中还采用标记已处理节点的方式减少了遍历的复杂度,本发明实施例提供一种由近至远的图搜索方式,通过迭代以及队列的图搜索方式代替现有技术的递归遍历方法,因此提高图搜索的效率,且克服了现有技术的栈溢出的风险。

附图说明

图1为本发明实施例提供一种基于迭代的图搜索方法的流程方框示意图;

图2为本发明实施例提供的基于迭代的图搜索方法的一种应用场景示意图;

图3为本发明实施例提供的网络图的组成结构示意图;

图4为本发明实施例提供的队列的组成结构示意图;

图5为本发明实施例提供的根节点v被插入队列以及从队列中弹出的示意图;

图6为本发明实施例提供的节点v-1从队列中弹出后插入新节点的示意图。

具体实施方式

本发明实施例提供了一种基于迭代的图搜索方法,用于提高图搜索的效率。

为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部实施例。基于本发明中的实施例,本领域的技术人员所获得的所有其他实施例,都属于本发明保护的范围。

本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的术语在适当情况下可以互换,这仅仅是描述本发明的实施例中对相同属性的对象在描述时所采用的区分方式。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,以便包含一系列单元的过程、方法、系统、产品或设备不必限于那些单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它单元。

以下分别进行详细说明。

本发明基于迭代的图搜索方法的一个实施例,可应用于图搜索算法场景中,在图数据库中存储有关联关系的节点时,都可以通过本发明实施例提供的方法快速完成图搜索,例如图数据库中的节点名可以用户id,关联关系可以表示与用户发生过关联的节点,例如用户购买商品,或者两个用户之间有过聊天记录等。请参阅图1所示,本发明提供的基于迭代的图搜索方法,可以包括如下步骤:

步骤s10、将图数据库中的第一节点加入到队列中,图数据库中包括网络图中的n个节点,其中,第一节点属于n个节点中的一个节点,n个节点中存在通过连边相连接的至少两个节点,n为正整数。

其中,图数据库中存储有n个节点,n的取值不做限制,则后续实施例中出现的第二节点、第三节点和第四节点等都属于该n个节点中的某个节点,这些节点之间可以通过连边相连接,例如通过连边连接的两个节点为父子节点。

步骤s20、以第一节点作为父节点遍历图数据库,从图数据库中搜索出第二节点,其中,第二节点属于n个节点中的一个节点,第一节点与第二节点之间存在连边,且第二节点是没有被标记为已处理的节点。

在图数据库中存储有大量的节点,例如存储有n个节点,则以第一节点作为父节点遍历图数据库,从图数据库中搜索出满足下述条件的节点作为第二节点:第一节点与第二节点之间存在连边,且第二节点是没有被标记为已处理的节点。此处以从图数据库中搜索出第二节点为例,该第二节点的个数可以是一个或者多个。

其中,本发明实施例中需要对已做过处理的节点进行标记,以防止下次遍历时重新再处理该节点,提高节点的遍历效率。

步骤s30、将第二节点加入到队列中,并将第一节点标记为已处理的节点。

在本发明实施例中,第二节点因为和第一节点之间存在父子节点的关系,因此通过第一节点可以将第二节点从图数据库中被搜索出,该第二节点也需要加入到队列中,例如该第二节点被存储在队列中的第一节点之后的位置,通过步骤s10和步骤s20的说明可知,此时第一节点为已处理过的节点,此时在图数据库中对该第一节点做出标记。

步骤s40、将第一节点从队列中弹出,判断队列中的所有节点是否被弹出,若还存在没有被弹出的节点,将队列中还剩余的节点作为父节点重新搜索图数据库,并搜索到新的节点之后更新队列,直至队列中的所有节都被弹出,结束图搜索流程。

在本发明实施例中,步骤s10至步骤s30中完整说明了第一节点作为父节点搜索图像数据库,基于该第一节点搜索到的第二节点被加入队列中,从而实现队列的更新,最后该第一节点还需要在处理完成之后从队列中弹出,因此该队列始终处于有进有出的情况,因此需要处理的队列规模不会无限增大,因此图搜索效率高。对于队列中的第二节点,仍可以执行类似步骤s10至步骤s30的处理方式,第二节点作为队列中没有被弹出的节点,将队列中还剩余的节点作为父节点重新搜索图数据库,并搜索到新的节点之后更新队列,直至队列中的所有节都被弹出,结束图搜索流程。

在本发明的一些实施例中,除了执行前述的步骤s10至步骤s40的处理方式之外,在步骤s30执行之后,本发明实施例提供的方法还包括如下步骤:

将第一节点从队列中弹出之后,以第二节点作为父节点遍历图数据库,从图数据库中搜索出第三节点和第四节点,其中,第三节点和第四节点属于n个节点中的两个节点,第二节点分别与第三节点、第四节点之间存在连边,且第三节点和第四节点是没有被标记为已处理的节点;

将第三节点和第四节点依次加入到队列中,并将第二节点标记为已处理的节点;

将第二节点从队列中弹出。

其中,上述过程描述了以第二节点作为父节点遍历图数据库时,若搜索到了多个节点时的处理方法,与步骤s30和步骤s40类似,但是将第三节点和第四节点依次加入到队列中,因此在搜索到多个节点时都可以采用类似的依次加入的方式来完成对多个节点的处理,从而提高了队列处理的效率。

在本发明的一些实施例中,步骤20以第一节点作为父节点遍历图数据库,从图数据库中搜索出第二节点,包括:

以第一节点作为父节点遍历图数据库中是否存在相应的至少一个子节点;

若图数据库中存在一个当前子节点时,判断当前子节点是否被标记为已处理的节点;

若当前子节点被标记为已处理的节点,则跳过当前子节点不做处理;

若当前子节点没有被标记为已处理的节点,则确定当前子节点为第二节点。

其中,对于与第一节点存在父子关系的至少一个子节点,都可以先判断子节点是否被标记为已处理的节点,若当前子节点被标记为已处理的节点,则跳过当前子节点不做处理,在图数据库规模很大时,通过这种预先标记的方式,可以使得已经处理过的节点不再作为顶点执行类似步骤s10至步骤s40的处理方案,使得图数据库可以被快速搜索完毕。

在本发明的一些实施例中,步骤s10将图数据库中的第一节点加入到队列中之前,除了执行前述的步骤s10至步骤s40的处理方式之外,本发明实施例提供的方法还包括如下步骤:

从图数据库中获取需要用于搜索的根节点,根节点属于n个节点中的一个节点,且根节点为网络图的初始节点;

以根节点作为父节点遍历图数据库,从图数据库中搜索出第一节点,其中,第一节点属于n个节点中的一个节点,第一节点与根节点之间存在连边,且第一节点是没有被标记为已处理的节点;

在搜索出第一节点之后,触发执行如下步骤s10:将图数据库中的第一节点加入到队列中。

其中,在第一节点执行步骤s10至步骤s40之前,首先获取到网络图中的初始节点,该初始节点即为图数据库中获取根节点,通常在图数据库中根节点只有一个,该根节点是需要用于搜索的节点,只有在获取到根节点的情况下,从而可以进行后续过程的遍历图数据库以及队列的更新,实现基于根节点的图搜索触发执行流程。

在本发明的一些实施例中,网络图包括如下类型图中的至少一种:有向网络图、无向网络图、有环网络图、无环网络图。其中,本发明实施例图数据库中保存的网络图类型可以有多种,有向网络图、无向网络图是指节点之间连边是否具有方向性而划分的图,有环网络图、无环网络图是指网络图中是否有环路而划分的图。本发明实施例提供的基于迭代的图搜索方法适用于上述多种类型的网络图,解决了不同类型网络图下的图搜索问题。

在本发明的一些实施例中,队列采用先加入先弹出的方式管理队列中的节点。本发明实施例中队列管理的节点采用先加入先弹出的方式,针对队列中的各个节点逐一作为父节点来遍历图数据库,使得节点的处理有序进行,提高队列中的节点数据管理效率。

接下来进行详细场景的举例说明。

如图2所示,为本发明实施例提供的基于迭代的图搜索方法的一种应用场景示意图。本发明实施例在于提供一种由近至远的图搜索方式,通过迭代和队列的图搜索方法代替现有技术的递归遍历方法。

本发明实施例的核心思路如下,使用队列的数据结构,首先加入顶点,以该顶点作为起点,每次从队列中取出一个节点,队列从图数据库获取,队列里面存的是节点信息,将该节点的所有关联节点加入队列,该节点的关联节点是从图中得到,重复直至队列中无节点。该方法可以采用树搜索的先序遍历方式,其中先序遍历(pre-order),按照根左右的顺序沿一定路径经过路径上所有的结点。在二叉树中,先根后左再右。在对每个顶点的处理时使用迭代的方式代替现有技术的递归方式,从而提高图搜索的效率。

本发明实施例采用的方案中,还需要进行闭环处理、迭代结束判断,详见后续的举例说明。本发明实施例中采用的算法复杂度分析如下:若有n个顶点、e条边,最差情形下,该算法必须寻找所有到可能节点的所有路径,因此其时间复杂度为o(|n|+|e|),其中|n|是节点的数目,而|e|是图中边的数目。

步骤1:在队列中插入需要用作图搜索的初始节点。

获取图中需要用来搜索的节点v加入队列,以该队列作为初始状态,开始对图数据进行遍历。图数据指图数据库的数据。例如,图3为本发明实施例提供的网络图的组成结构示意图。顶点和顶点之间通过边连接,一个顶点还可以连接别的顶点。图3中根节点v分别连接节点v-1、节点v-2和节点v-3,节点v-1又连接节点v-1-1和节点v-1-2,节点v-2连接节点v-2-1,节点v-2-1连接节点v-2-1-1。

如图4所示,为本发明实施例提供的队列的组成结构示意图,v-1、节点v-2、节点v-3、v-1-1和节点v-1-2、点v-2-1、节点v-2-1-1分别一次插入队列,然后从根节点v开始依次弹出队列,详见后续实施例的说明。

如图5所示,为本发明实施例提供的根节点v被插入队列以及从队列中弹出的示意图。将图5中的根节点v加入队列,开始对图谱进行遍历。遍历时,所有的节点只要是有关联关系都会加入到这个队列里。

步骤2:判断队列是否为空,若为空,结束图搜索,若不是空,执行步骤3。

在步骤2中,从队列中取出一个顶点,每次只取出一个节点分析,以该顶点为父节点遍历从图数据库中获取到的原始数据数组,将与该顶点直接相连并且没有被标记为已处理的所有顶点依次加入队列中,完成队列插值后,对该顶点做出自定义的标注处理,根据具体的业务情况而定,并将该顶点标记为已处理。

如图6所示,为本发明实施例提供的节点v-1从队列中弹出后插入新节点的示意图。例如,遍历得出根节点v的子节点存在v-1、v-2和v-3,将三个节点依次加入图6左队列,并取出根节点v,从图6的左队列中弹出根节点v,重新进行遍历,遇到已经处理的节点直接跳过。将图6中的节点v-1取出队列找出节点v-1-1和节点v-1-2继续加入图6的右队列,而后继续对节点v-2继续遍历,依次类推,直到队列中所有节点都被取出。

步骤3:取出一个节点并标记为已处理,找出与该节点相关且未被标记为已处理并加入队列。

在步骤3中,重复步骤2,取出并处理顶点,如果队列中已经没有顶点了,就退出循环,完成算法,只要节点之间存在关系就能将所有节点遍历完全。

通过前述的举例说明可知,首先将图数据库中的第一节点加入到队列中,然后以第一节点作为父节点遍历图数据库,在第一节点与第二节点之间存在连边,且第二节点是没有被标记为已处理的节点的情况下,该第二节点作为从图数据库中搜索出的节点,接下来将第二节点加入到队列中,并将第一节点标记为已处理的节点,最后将第一节点从队列中弹出,判断队列中的所有节点是否被弹出,若还存在没有被弹出的节点,将队列中还剩余的节点作为父节点重新搜索图数据库,并搜索到新的节点之后更新队列,直至队列中的所有节都被弹出,结束图搜索流程。本发明实施例中使用队列来管理图数据库中的节点,并对该队列中的节点进行插入和弹出的管理控制,从而通过以父节点的身份遍历图数据库的方式,使得图数据库中存在父子关系的节点都被插入到队列中,本发明实施例中还采用标记已处理节点的方式减少了遍历的复杂度,本发明实施例提供一种由近至远的图搜索方式,通过迭代以及队列的图搜索方式代替现有技术的递归遍历方法,因此提高图搜索的效率,且克服了现有技术的栈溢出的风险。

另外需说明的是,以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。另外,本发明提供的装置实施例附图中,模块之间的连接关系表示它们之间具有通信连接,具体可以实现为一条或多条通信总线或信号线。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,所属领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件的方式来实现,当然也可以通过专用硬件包括专用集成电路、专用cpu、专用存储器、专用元器件等来实现。一般情况下,凡由计算机程序完成的功能都可以很容易地用相应的硬件来实现,而且,用来实现同一功能的具体硬件结构也可以是多种多样的,例如模拟电路、数字电路或专用电路等。但是,对本发明而言更多情况下软件程序实现是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在可读取的存储介质中,如计算机的软盘、u盘、移动硬盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、磁碟或者光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。

综上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照上述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对上述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1