具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明实施方式作进一步地详细描述。在描述过程中需要用二进制数值,在以下内容中用小写b开头的0和1组成的数字来表示二进制数值,比如b100表示二进制数值100。
实施例1
参见图1,本发明实施例提供了一种判断流程图中是否存在循环回路的方法,包括:
101:根据流程图中每个节点的状态和预设的节点状态与状态值之间的对应关系,得到流程图中每个节点的状态值。
102:判断是否能够搜索到当前节点的相邻出口节点。
103:如果能够搜索到当前节点的相邻出口节点,则将搜索到的当前节点的所有相邻出口节点中的一个相邻出口节点作为第一当前相邻出口节点。
104:将第一当前相邻出口节点的原状态值与已搜索状态值进行或运算,得到第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值。
105:判断第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值与第一当前相邻出口节点的原状态值是否相等。
106:如果第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值与第一当前相邻出口节点的原状态值不相等,将第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值作为第一当前相邻出口节点的当前状态值。
107:判断是否能够搜索到第一当前相邻出口节点的相邻出口节点。
108:如果不能够搜索到第一当前相邻出口节点的相邻出口节点,则判断当前节点的所有入口节点中是否存在状态值为已搜索状态值的节点。
109:如果当前节点的所有入口节点中存在状态值为已搜索状态值的节点,则证明将第一当前相邻出口节点作为当前节点的流转节点时,存在循环回路。
进一步地,判断第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值与第一当前相邻出口节点的原状态值是否相等之后,该方法还包括:
如果第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值与第一当前相邻出口节点的原状态值相等,则判断当前节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点。
如果当前节点的所有相邻出口节点中存在未被执行过的相邻出口节点,则将当前节点的所有未被执行过的相邻出口节点中的一个相邻出口节点作为第一当前相邻出口节点,然后执行将第一当前相邻出口节点的原状态值与已搜索状态值进行或运算的步骤。
进一步地,判断是否能够搜索到第一当前相邻出口节点的相邻出口节点之后,该方法还包括:
如果能够搜索到第一当前相邻出口节点的相邻出口节点,则将搜索到的第一当前相邻出口节点的所有相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点。
判断第二当前相邻出口节点的原状态值是否是已执行状态值。
如果第二当前相邻出口节点的原状态值是已执行状态值,则判断第一当前相邻出口节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点。
如果第一当前相邻出口节点的所有相邻出口节点中存在未被执行过的相邻出口节点,则将第一当前相邻出口节点的所有未被执行过的相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点,然后执行判断第二当前相邻出口节点的原状态值是否是已执行状态值的步骤。
进一步地,判断第二当前相邻出口节点的原状态值是否是已执行状态值之后,该方法还包括:
如果第二当前相邻出口节点的原状态值不是已执行状态值,则将第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值进行或运算,得到或运算结果值。
判断第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值的或运算结果值与第二当前相邻出口节点的原状态值是否相等。
如果第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值的或运算结果值与第二当前相邻出口节点的原状态值相等,则执行判断第一当前相邻出口节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点的步骤。
进一步地,判断第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值的或运算结果值与第二当前相邻出口节点的原状态值是否相等之后,该方法还包括:
如果第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值的或运算结果值与第二当前相邻出口节点的原状态值不相等,则将第二当前相邻出口节点的原状态值与已搜索状态值的或运算结果值作为第二当前相邻出口节点的当前状态值。
判断是否能够搜索到第二当前相邻出口节点的相邻出口节点。
如果能够搜索到第二当前相邻出口节点的相邻出口节点,则将第二当前相邻出口节点作为第一当前相邻出口节点,将搜索到的第二当前相邻出口节点的所有相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点,然后执行判断第二当前相邻出口节点的原状态值是否是已执行状态值的步骤。
进一步地,判断是否能够搜索到第二当前相邻出口节点的相邻出口节点之后,该方法还包括:
如果不能够搜索到第二当前相邻出口节点的相邻出口节点,则判断第一当前相邻出口节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点。
如果第一当前相邻出口节点的所有相邻出口节点中存在未被执行过的相邻出口节点,则将第一当前相邻出口节点的所有未被执行过的相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点,然后执行判断第二当前相邻出口节点的原状态值是否是已执行状态值的步骤。
进一步地,判断第一当前相邻出口节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点之后,该方法还包括:
如果第一当前相邻出口节点的所有相邻出口节点中不存在未被执行过的相邻出口节点,则执行判断当前节点的所有入口节点中是否存在状态值为已搜索状态值的节点的步骤。
进一步地,判断当前节点的所有入口节点中是否存在状态值为已搜索状态值的节点之后,该方法还包括:
如果当前节点的所有入口节点中不存在状态值为已搜索状态值的节点,则证明将第一当前相邻出口节点作为当前节点的流转节点时,不存在循环回路。
本发明实施例所述的判断流程图中是否存在循环回路的方法,利用二进制“或(XOR)”运算的特点,通过设置各个节点状态的状态值,实现只需判断一次或运算结果值就可以得知是否存在循环回路,即只需判断一个表达式就可以获得组合判断结果,判断方式简单,提高了判断算法的运行速度。
实施例2
参见图2a和图2b,本发明实施例提供了一种判断流程图中是否存在循环回路的方法,包括:
201:根据流程图中每个节点的状态和预设的节点状态与状态值之间的对应关系,得到流程图中每个节点的状态值。
本发明实施例中,设节点状态包括未执行、已执行、跳过和已搜索。并且预设的节点状态与状态值之间的对应关系如下:未执行对应的状态值为b000、已执行对应的状态值为b111、跳过对应的状态值为b010、已搜索对应的状态值为b110。并且,为了便于描述,将未执行对应的状态值称为未执行状态值、已执行对应的状态值称是已执行状态值、跳过对应的状态值称为跳过状态值、已搜索对应的状态值称为已搜索状态值。
例如,参见图3和图4,根据流程图中每个节点的状态和预设的节点状态与状态值之间的对应关系,将流程图3中每个节点的状态标注为相应的状态值,得到如图4所示的结果。
并且,还可以设置节点状态与状态值之间的对应关系如下:未执行对应的状态值为b0000、已执行对应的状态值为b1110、跳过对应的状态值为b0100、已搜索对应的状态值为b1100。或还可以设置节点状态与状态值之间的对应关系如下:未执行对应的状态值为b0000、已执行对应的状态值为b1101、跳过对应的状态值为b0100、已搜索对应的状态值为b1100。或还可以设置节点状态与状态值之间的对应关系如下:未执行对应的状态值为b00000、已执行对应的状态值为b01101、跳过对应的状态值为b00100、已搜索对应的状态值为b01100。即可以根据实际应用状况设置未执行、已执行、跳过和已搜索的状态值为一组与b000、b111、b010和b110的二进制标志位具有类似对应关系的值。
202:判断是否能够搜索到当前节点的相邻出口节点,如果能够,则执行203;否则,结束。
其中,当前节点是指流程图执行过程中当前执行到的需要判断其的相邻出口节点是否存在循环回路的节点。当前节点的相邻出口节点是指与当前节点相关联的第一个出口节点。
例如,参见图3,其中当前节点为步骤B所在的节点,当前节点的相邻出口节点为步骤C所在的节点。
203:将搜索到的当前节点的所有相邻出口节点中的一个相邻出口节点作为第一当前相邻出口节点。
例如,参见图3,其中当前节点的相邻出口节点只有一个为步骤C所在的节点,则将步骤C所在的节点作为第一当前相邻出口节点。
204:将第一当前相邻出口节点的原状态值与已搜索状态值进行“或(XOR)”运算,得到或运算结果值。
205:判断或运算结果值与第一当前相邻出口节点的原状态值是否相等,如果相等,则执行220;否则,执行206。
例如,参见图3和图4,步骤C所在的节点为第一当前相邻出口节点,则第一当前相邻出口节点的原状态值为b000。将b000与b110进行“或(XOR)”运算,得到或运算结果值b110。从而判断出或运算结果值与第一当前相邻出口节点的原状态值不相等,则执行206。
206:将第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值作为第一当前相邻出口节点的当前状态值,然后执行207。
例如,参见图3、图4、图5和图6,步骤C所在的节点为第一当前相邻出口节点,且第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值为b110,从而第一当前相邻出口节点的当前状态值为b110。
207:判断是否能够搜索到第一当前相邻出口节点的相邻出口节点,如果能够,则执行208;否则,执行217。
例如,参见图3、图4、图5和图6,步骤C所在的节点为第一当前相邻出口节点,则第一当前相邻出口节点的相邻出口节点分别为步骤A所在的节点和步骤E所在的节点。
208:将搜索到的第一当前相邻出口节点的所有相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点。
例如:将步骤A所在的节点作为第二当前相邻出口节点。
209:判断第二当前相邻出口节点的原状态值是否是已执行状态值,如果是,则执行215;否则,执行210。
例如:步骤A所在的节点为第二当前相邻出口节点,参见图4,步骤A所在的节点的原状态值为b010(为已跳过状态值),不是已执行状态值,从而执行210。
210:将第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值进行“或(XOR)”运算,得到或运算结果值。
例如:参见图3、图4、图5和图6,第二当前相邻出口节点(步骤A所在的节点)的原状态值为b010,第一当前相邻出口节点(步骤C所在的节点)的当前状态值为b110,则第二当前相邻出口节点的原状态值b010与第一当前相邻出口节点的当前状态值b110进行“或(XOR)”运算得到或运算结果值为b110。
211:判断或运算结果值与第二当前相邻出口节点的原状态值是否相等,如果相等,则执行215;否则,执行212。
例如:参见图3、图4、图5和图6,第二当前相邻出口节点(步骤A所在的节点)的原状态值与第一当前相邻出口节点(步骤C所在的节点)的当前状态值的或运算结果值b110,与第二当前相邻出口节点的原状态值b010不相等,从而执行212。
212:将第二当前相邻出口节点的原状态值与已搜索状态值的或运算结果值作为第二当前相邻出口节点的当前状态值,然后执行213。
例如:参见图3、图4、图5和图6,第二当前相邻出口节点(步骤A所在的节点)的原状态值与第一当前相邻出口节点(步骤C所在的节点)的当前状态值的或运算结果值b110,则第二当前相邻出口节点的当前状态值为b110。
213:判断是否能够搜索到第二当前相邻出口节点的相邻出口节点,如果能够,则执行214;否则,执行215。
例如:参见图3、图4、图5和图6,第二当前相邻出口节点(步骤A所在的节点)的相邻出口节点分别为步骤B所在的节点和步骤D所在的节点。
214:将第二当前相邻出口节点作为第一当前相邻出口节点,将搜索到的第二当前相邻出口节点的所有相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点,然后执行209。
即按照递归算法对第二当前相邻出口节点的出口节点依次进行判断。
例如:参见图3、图4、图5和图6,将步骤B所在的节点作为第二当前相邻出口节点。步骤B所在的节点的状态值为b111(已执行状态值),所以执行209后转到215。第一当前相邻出口节点(步骤C所在的节点)的相邻出口节点分别为步骤A所在的节点和步骤E所在的节点,由于步骤E所在的节点还未被执行过,所以执行215后转到216。将步骤E所在的节点作为第二当前相邻出口节点,执行216后转到209。如此递归进行直到执行到结束所在的节点。参见图6,为按照本发明实施例所述的方法执行后的各个节点的状态值图。
215:判断第一当前相邻出口节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点,如果存在,执行216;否则,执行217。
216:将第一当前相邻出口节点的所有未被执行过的相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点,然后执行209。
217:判断当前节点的所有入口节点中是否存在状态值为已搜索状态值的节点,如果存在,则执行218;否则,执行219。
例如:参见图5、图6,当前节点为步骤B所在的节点,当前节点的入口节点分别为步骤A所在的节点和X所在的节点,其中,步骤A所在的节点的状态值为已搜索状态值(b110),所以执行218。
218:证明将第一当前相邻出口节点作为当前节点的流转节点时,存在循环回路,然后执行220。
并且,在证明将第一当前相邻出口节点作为当前节点的流转节点时存在循环回路后,可以将第一当前相邻出口节点存在循环回路的信息记录下来,供流程图执行时参考。具体地,可以通过对第一当前相邻出口节点设定存在循环回路标记等方法将第一当前相邻出口节点存在循环回路的信息记录下来。
219:证明将第一当前相邻出口节点作为当前节点的流转节点时,不存在循环回路,然后执行220。
220:判断当前节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点,如果存在,执行221;否则,结束。
221:将当前节点的所有未被执行过的相邻出口节点中的一个相邻出口节点作为第一当前相邻出口节点,然后执行204。
本发明实施例所述的判断流程图中是否存在循环回路的方法,利用二进制“或(XOR)”运算的特点,通过设置各个节点状态的状态值,实现只需判断一次或运算结果值就可以得知是否存在循环回路,即只需判断一个表达式就可以获得组合判断结果,判断方式简单,提高了判断算法的运行速度。
实施例3
本发明实施例提供了一种判断流程图中是否存在循环回路的装置,参见图7,该装置包括:
标注模块301,用于根据预设的节点状态与状态值之间的对应关系,将流程图中每个节点的状态标注为相应的状态值;
第一判断模块302,用于当标注模块301将流程图中每个节点的状态标注为相应的状态值后,判断是否能够搜索到当前节点的相邻出口节点;
第一处理模块303,用于当第一判断模块302判断能够搜索到当前节点的相邻出口节点后,将搜索到的当前节点的所有相邻出口节点中的一个相邻出口节点作为第一当前相邻出口节点;
第一运算模块304,用于当第一处理模块303将搜索到的当前节点的所有相邻出口节点中的一个相邻出口节点作为第一当前相邻出口节点后,将第一当前相邻出口节点的原状态值与已搜索状态值进行或运算,得到第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值;
第二判断模块305,用于当第一运算模块304得到第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值后,判断第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值与第一当前相邻出口节点的原状态值是否相等;
第二处理模块306,用于当第二判断模块305判断第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值与第一当前相邻出口节点的原状态值不相等时,将第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值作为第一当前相邻出口节点的当前状态值;
第三判断模块307,用于当第二处理模块306将第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值作为第一当前相邻出口节点的当前状态值后,判断是否能够搜索到第一当前相邻出口节点的相邻出口节点;
第四判断模块308,用于当第三判断模块307判断不能够搜索到第一当前相邻出口节点的相邻出口节点时,判断当前节点的所有入口节点中是否存在状态值为已搜索状态值的节点;
第一证明模块309,用于当第四判断模块308判断当前节点的所有入口节点中存在状态值为已搜索状态值的节点后,证明将第一当前相邻出口节点作为当前节点的流转节点时,存在循环回路。
进一步地,参见图8,该装置还包括:
第五判断模块310,用于当第二判断模块305判断第一当前相邻出口节点的原状态值与已搜索状态值的或运算结果值与第一当前相邻出口节点的原状态值相等时,判断当前节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点;
第三处理模块311,用于当第五判断模块310判断当前节点的所有相邻出口节点中存在未被执行过的相邻出口节点时,将当前节点的所有未被执行过的相邻出口节点中的一个相邻出口节点作为第一当前相邻出口节点,然后通知第一运算模块304执行将第一当前相邻出口节点的原状态值与已搜索状态值进行或运算的步骤。
进一步地,参见图9,该装置还包括:
第四处理模块312,用于当第三判断模块307判断能够搜索到第一当前相邻出口节点的相邻出口节点时,将搜索到的第一当前相邻出口节点的所有相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点;
第六判断模块313,用于当第四处理模块312将搜索到的第一当前相邻出口节点的所有相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点后,判断第二当前相邻出口节点的原状态值是否是已执行状态值;
第七判断模块314,用于当第六判断模块313判断第二当前相邻出口节点的原状态值是已执行状态值时,判断第一当前相邻出口节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点;
第五处理模块315,用于当第七判断模块314判断第一当前相邻出口节点的所有相邻出口节点中存在未被执行过的相邻出口节点时,将第一当前相邻出口节点的所有未被执行过的相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点,然后通知第六判断模块313执行判断第二当前相邻出口节点的原状态值是否是已执行状态值的步骤。
进一步地,参见图10,该装置还包括:
第二运算模块316,用于当第六判断模块313判断第二当前相邻出口节点的原状态值不是已执行状态值时,将第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值进行或运算,得到或运算结果值;
第八判断模块317,用于当第二运算模块316得到或运算结果值后,判断第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值的或运算结果值与第二当前相邻出口节点的原状态值是否相等;
第六处理模块318,用于当第八判断模块317判断第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值的或运算结果值与第二当前相邻出口节点的原状态值相等时,通知第七判断模块314执行判断第一当前相邻出口节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点的步骤。
进一步地,参见图11,该装置还包括:
第七处理模块319,用于当第八判断模块317判断第二当前相邻出口节点的原状态值与第一当前相邻出口节点的当前状态值的或运算结果值与第二当前相邻出口节点的原状态值不相等时,将第二当前相邻出口节点的原状态值与已搜索状态值的或运算结果值作为第二当前相邻出口节点的当前状态值;
第九判断模块320,用于当第七处理模块319将第二当前相邻出口节点的原状态值与已搜索状态值的或运算结果值作为第二当前相邻出口节点的当前状态值后,判断是否能够搜索到第二当前相邻出口节点的相邻出口节点;
第八处理模块321,用于当第九判断模块320判断能够搜索到第二当前相邻出口节点的相邻出口节点后,将第二当前相邻出口节点作为第一当前相邻出口节点,将搜索到的第二当前相邻出口节点的所有相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点,然后通知第六判断模块313执行判断第二当前相邻出口节点的原状态值是否是已执行状态值的步骤。
进一步地,参见图12,该装置还包括:
第十判断模块322,用于当第九判断模块320判断不能够搜索到第二当前相邻出口节点的相邻出口节点时,判断第一当前相邻出口节点的所有相邻出口节点中是否存在未被执行过的相邻出口节点;
第九处理模块323,用于当第十判断模块322判断第一当前相邻出口节点的所有相邻出口节点中存在未被执行过的相邻出口节点时,将第一当前相邻出口节点的所有未被执行过的相邻出口节点中的一个相邻出口节点作为第二当前相邻出口节点,然后通知第六判断模块313执行判断第二当前相邻出口节点的原状态值是否是已执行状态值的步骤。
进一步地,参见图13,该装置还包括:
第十处理模块324,用于当第七判断模块314判断第一当前相邻出口节点的所有相邻出口节点中不存在未被执行过的相邻出口节点后,通知第四判断模块308执行判断当前节点的所有入口节点中是否存在状态值为已搜索状态值的节点的步骤。
进一步地,参见图14,该装置还包括:
第二证明模块325,用于当第四判断模块308判断当前节点的所有入口节点中不存在状态值为已搜索状态值的节点后,证明将第一当前相邻出口节点作为当前节点的流转节点时,不存在循环回路。
本发明实施例所述的判断流程图中是否存在循环回路的装置,利用二进制“或(XOR)”运算的特点,通过设置各个节点状态的状态值,实现只需判断一次或运算结果值就可以得知是否存在循环回路,即只需判断一个表达式就可以获得组合判断结果,判断方式简单,提高了判断算法的运行速度。
以上实施例提供的技术方案中的全部或部分内容可以通过软件编程实现,其软件程序存储在可读取的存储介质中,存储介质例如:计算机中的硬盘、光盘或软盘。
以上所述仅为本发明的较佳实施例,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。