On 09/07/2010 02:43 AM, Peter Alexander wrote:
I agree with Andrei here, building hypercubes makes more sense, and feels like 
it has more structure. It
also has the nice property that, once you've seen a (n+1)th element of any 
range then you have already
explored the entire product of the first n elements of every range, kind of 
like how the colex ordering
works.

But which way would you add the successive "shells"?

Like this?: (00) (01 10 11) (02 12 20 21 22)... i.e. lex order?

The algorithm builds one hyperplane at a time. At level k, there are n hyperplanes to build, each of which keeps exactly one range positioned on the kth element, and all others iterate from their first up to their kth element. Whenever you reached the corner of the hypercube (all ranges are at the kth position), you start building the next hyperplane. When all other hyperplanes are built, you popFront() the first range, reset all others, and start building the next shell.

btw, what are some real-world uses of the cartesian product of infinite ranges? 
I can't think of any off
the top of my head.

It's great for various solution-searching algorithms, like the example given (lazily generate solutions to the equation x * y = 8). Even for finite ranges of moderate size, exploring two iota()s in the naive order (keep one fixed and exhaust all others) most often takes a long time to find anything interesting. That's why I think finding a solid method to iterate the cartesian product is important even for finite ranges.


Andrei

Reply via email to