# Program Modeling

Information on this page is taken from *The Algorithm Design Manual* by Steven
S. Skiena.

Mobdeling is the art of formulating your application in terms of precisely described, well-understood problems. Proper modeling can eliminate the need to design or even implement algorithms, by relating your application to what has been done before.

Real-world applications involve real-world objects. Most algorithms, however,
are designed to work on rigorously defined *abstract* structures. To exploit
the algorithms literature, you must learn to describe your problem
abstractly, in terms of procedures on fundamental structures.

**Permutations**are arrangements, or orderings of items. Usually the object in question if your problem seeks an "arrangement," "tour," "ordering," or "sequence."**Subsets**are selects from a set of items. Usually the object in question if your problem seeks a "cluster," "collection," "committee," "group," "packaging," or "selection."**Trees**are hierarchical relationships between items. Usually the object in question whenever your problem seeks a "hierarchy," "dominance relationship," "ancestor/descendant relationship," or "taxonomy."**Graphs**represent relationships between arbitrary pairs of objects. Usually the object in question whenever you seek a "network," "circuit," "web," or "relationship."**Points**represent locations in some geometric space. Usually the object in question whenever your problems work on "sites," "positions," "date records," or "locations."**Polygons**represent regions in some geometric spaces. Usually the object in question whenever you are working on "shapes," "regions," "configurations," or "boundaries."**Strings**represent sequences of characters or patterns. Usually the object in question whenever you are dealing with "text," "characters," "patterns," or "labels."

Learn to think recursively. Recursive structures occur everywhere in the
algorithmic world. Each of the abstract structures described above can be
thought about recursively; they are big things made of smaller things of the
same type. Each structure has operations (like *delete*) that produce new
versions of the same type.