Reverse-search algorithm
Reverse-search algorithms are a class of algorithms for generating all objects of a given size, from certain classes of combinatorial objects. In many cases, these methods allow the objects to be generated in polynomial time per object, using only enough memory to store a constant number of objects. They work by organizing the objects to be generated into a spanning tree of their state space, and then performing a depth-first search of this tree.
Reverse-search algorithms were introduced by David Avis and Komei Fukuda in 1991, for problems of generating the vertices of convex polytopes and the cells of arrangements of hyperplanes. They were formalized more broadly by Avis and Fukuda in 1996.
Principles
A reverse-search algorithm generates the combinatorial objects in a state space, an implicit graph whose vertices are the objects to be listed and whose edges represent certain "local moves" connecting pairs of objects, typically by making small changes to their structure. It finds each objects using a depth-first search in a rooted spanning tree of this state space, described by the following information:- The root of the spanning tree, one of the objects
- A subroutine for generating the parent of each object in the tree, with the property that if repeated enough times it will eventually reach the root
- A subroutine for listing all of the neighbors in the state space
A classical depth-first search of this spanning tree would traverse the tree recursively, starting from the root, at each node listing all of the children and making a recursive call for each one. Unlike a depth-first search of a graph with cycles, it is not necessary to maintain the set of already-visited nodes to avoid repeated visits; such repetition is not possible in a tree. However, this recursive algorithm may still require a large amount of memory for its call stack, in cases when the tree is very deep. Instead, reverse search traverses the spanning tree in the same order while only storing two objects: the current object of the traversal, and the previously traversed object. Initially, the current object is set to the root of the tree, and there is no previous object. From this information, it is possible to determine the next step of the traversal by the following case analysis:
- If there is no previous object, or the previous object is the parent of the current object, then this is the first time the traversal has reached the current object, so it is output from the search. The next object is its first child or, if it has no children, its parent.
- In all other cases, the previous object must be a child of the current object. The algorithm lists the children one at a time until reaching this previous child, and then takes one more step in this list of children. If another child is found in this way, it is the next object. If there is no next child and the current object is not the root, the next object is the parent of the current object. In the remaining case, when there is no next child and the current object is the root, the reverse search terminates.
Applications
Examples of the problems to which reverse search has been applied include the following combinatorial generation problems:;Vertices of simple convex polytopes
;Cells of hyperplane arrangements
;Point-set triangulations
;Connected subgraphs
Other applications include algorithms for generating the following structures:
- Polyominos, polyiamond prototiles, and polyhex (mathematics) hydrocarbon molecules.
- Topological orderings of directed acyclic graphs, using a state space whose local moves reverse the ordering of two elements.
- Spanning trees of graphs, non-crossing spanning trees of planar point sets, and more generally bases of matroids, using a state space that swaps one edge for another.
- Euler tours in graphs.
- The maximal independent sets of sparse graphs.
- Maximal planar graphs and polyhedral graphs.
- Non-crossing minimally rigid graphs on a given point set.
- Surrounding polygons, polygons that have some of a given set of points as vertices and surround the rest, using a state space that adds or removes one vertex of the polygon.
- Vertices or facets of the Minkowski sum of convex polytopes.
- The corners of monomial ideals.