Some Java/C# design flaws

Justin Johansson no at spam.com
Mon Feb 1 13:46:38 PST 2010


bearophile wrote:
> Justin Johansson:
>> Would you kindly explain what exactly is the "quadratic enumerable
>> behaviour" problem.
> 
> This is a binary tree preorder scan in Python, it contains "yield" that makes this a generator:
> 
> def preorder(root):
>     if root is not None:
>         yield root
>         if root.left is not None:
>             for n in preorder(root.left):
>                 yield n
>         if root.right is not None:
>             for n in preorder(root.right):
>                 yield n
> 
> Being it a generator you can give the root of the binary tree to it, and then you can iterate on all the nodes like this:
> for node in preorder(root):
>    do_something(node)
> 
> I am not 100% sure, but I think the problem comes from those  for n in preorder(root.left):  that turn a tree scan, that is O(n) in a O(n^2) algorithm.
> 
> Some Python people have proposed an improvement to generators that as a side effect can lead to reducing that quadratic behaviour back to linear. The following is not the syntax they have proposed but it's more easy to understand. Instead of:
> for n in preorder(root.left):
>     yield n
> Something that works as:
> yield *preorder(root.left)
> That is a yield that knows how to deal with more than one item, then the C machinery under Python has a chance to optimize things away. I think Lua doesn't share this Python problem.
> 
> Bye,
> bearophile

Thanks for the heads up.

It sounds like, at least in this example, that the preorder algorithm be 
re-written in iterative fashion rather than recursive fashion as 
currently is.  I suspect that would bring the generator behaviour back 
to O(n).

Funny about this; virtually every CS101 course covers recursive binary
tree node visitation but rarely is there a mention of the iterative
solution.  The iterative solution is much more tricky but for larger N,
is almost a must for practical situations.

Cheers
Justin



More information about the Digitalmars-d mailing list