The following diagram shows the containment of different complexity classes:
Polynomial Time reducibility:
A language L1⊆ ∑ * is said to be polynomial time reducible to L2 ⊆∑ * if there is a polynomial time computable function f ( ) such that ∀ x ∈ ∑*, x ∈ L1 if and only if f (x) ∈ L2 . We denote this by L1 ∝p L2. we can clearly observe that polynomial time reductions are transitive.
Completeness:
A language L ⊆∑* is said to be complete with respect to any complexity class C if all problems in that complexity class C can be reduced to L.Thus we formally define the notion of NP-Completeness.
Definition 6:
A language L ⊆ ∑ * is said to be NP-Complete if
(i) L∈NP
(ii) ∀L′∈NP, we have L′ ∝p L.
The above definition is not very suitable to prove a language L to be NP-Complete since we have infinitely many language in the class NP to be reduced to L. Hence for providing NP-Completeness we resort to the following equivalent definition.
Definition 7:
A language L is said to be NP-Complete if
(i) L∈ NP
(ii) ∃ L' ⊆ ∑* that is NP-Complete and L' ∝p L.
The previous two definitions are equivalent since:
L' is NP-Complete ⇒ ∀ L″∈NP, L″∝p L ′ (from definition 6) ⇒ ∀ L″∈ NP, L″∝p L′ ∝p L ⇒ ∀ L″∈ NP, L″ ∝p L (from the transitivity of polynomial time reductions.) ⇒ L is NP-Complete.
Only catch in this approach is to prove the first problem to be NP-Complete for which we usually take as SATISFIABILITY problem.