User:Creidieki/NL rewrite 2

NL (complexity)

In computational complexity theory, NL is a complexity class -- a group of all of the computational problems which can be solved with a certain amount of a certain resource. Intuitively, NL describes all problems of at most a certain difficulty. NL is a well-studied complexity class, and would be covered in most graduate courses in complexity theory.

NL contains all of the problems which can be solved using a logarithmic amount of memory space on a nondeterministic computer. Effectively, we allow a very restricted amount of computation on a powerful machine model. The resulting class is comparatively "weak" -- every problem in NL can be solved quickly on a classical computer.

Results from complexity theory and algorithms allow us to study which problems are members of NL, and to understand the relationship between this class and other classes. A perfect understanding of NL would yield deep insights into the nature of memory space and of nondeterminism, and would give us practical lower bounds for the resources necessary to solve problems. Unfortunately, like much of complexity theory, many important questions about NL are still open (see Open problems in computational complexity theory).

Decision problems
NL is a set of decision problems. A decision problem is a yes-or-no question with an infinite number of specific instances. For example, ST-CONNECTIVITY is the problem, "Given a directed graph G and two nodes S and T, is there a path from S to T"? Note that we can ask this question about any graph and any two nodes. We are interested in studying the question in the abstract. This problem is a decision problem, because we are asking only a yes-or-no question -- we are not asking what the path is, simply whether there is one.

Complexity theory often deals with decision problems rather than search problems or function problems. A function-problem version of ST-CONNECTIVITY would ask, "Given a directed graph G and two nodes S and T, output a path from S to T". Function problems intuitively seem more expressive, and "harder", than decision problems, but they are usually are of equal difficulty; see Decision problems and function problems. Using decision problems makes several aspects of complexity theory easier; see decision problem. NL has a related complexity class of function problems, called FNL.

Algorithms and asymptotic analysis
An algorithm is a formal method of solving a particular decision problem. Each algorithm must be capable of solving all of the specific instances of a decision problem. For example, an algorithm for ST-CONNECTIVITY might be, "Starting from node S, walk through the graph in a breadth-first search, listing all of the nodes reachable from S.  See if T is one of the reachable nodes.". This algorithm solves ST-CONNECTIVITY, because it works on any possible set of inputs -- given any graph G, node S, and node T, we can use this algorithm to check whether T is reachable for S.

We are often interested in the resources used by a particular algorithm. We might want to examine the amount of computation time or of memory space used. Since an algorithm must be capable of solving all possible inputs, it doesn't make sense to talk about the time needed for one particular input -- larger graphs will take longer to solve with any ST-CONNECTIVITY algorithm. We use a method called asymptotic analysis to describe the algorithm's resources as a function of the size of the input. For example, the number of timesteps needed for the ST-CONNECTIVITY algorithm given above is asymptotically no more than (function); we write that it is $$O(func)$$ (see Big O notation).

There may be many algorithms for a particular decision problem, and these algorithms may use very different amounts of resources.

Complexity classes
Sorting the A complexity class consists of all of the computational problems which can be solved on a certain type of machine, using a certain amount of a certain resource. Computational complexity theory studies the relationships between these classes, hoping to learn

It is not always obvious which complexity classes a given

Computational complexity theory studies the relationships between these classes, hoping to learn which resources Some methods of solving a problem are faster than others, and

Complexity classes are often defined in terms of Algorithms, we would look for a computer program which can solve every instance of ST-CONNECTIVITY. In Complexity Theory, we

Understanding the structure of NL allows us to

Relations with other complexity classes
Introductory material here.

Memory space
One of the most well-studied complexity resources is memory space.

Logarithmic space
NL is one of several complexity classes involving

Larger classes
Go into P (complexity).