"MRAB" wrote in message news:1f67363c-4d2a-f5ac-7fa8-b6690ddba...@mrabarnett.plus.com...

On 2018-01-15 06:15, Frank Millman wrote:

> I start my cycle-detection with a node with 0 incoming connections.
>
> def find_cycle(node, path):
>      for output in node.outputs:
>          if output in path:
>              print('Cycle found in', path)
>          else:
>              new_path = path[:]
>              new_path.append(output)
>              find_cycle(output, new_path)
>
> find_cycle(node, [node])
>
> This traverses every possible path in the graph. I think/hope that a > typical
> business process will not grow so large as to cause a problem.
>
> If anyone can see a flaw in this, please let me know.
>
 A couple of suggestions:

1. Instead of copying the list and appending, I'd do:

     find_cycle(output, path + [output])

2. Lists are ordered, but searching them is O(n), so I'd pass a set too to speed it up a bit:

     def find_cycle(node, path, visited):
         for output in node.outputs:
             if output in visited:
                 print('Cycle found in', path)
             else:
                 find_cycle(output, path + [output], visited | {output})

That will help as the paths get longer, although on a small graph, it won't matter.

Both suggestions are much appreciated - so simple, and yet they improve my code enormously.

I have never seen the use of '|' to update a set before, though now I check the docs, it is there. It is very neat.

Many thanks

Frank


--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to