Advanced Data Structures & Algorithms

Chapter 11
Computational Complexity and Tractability

Post Graduate Program in Information Technology
Advanced Data Structures & Algorithms   •   Post Graduate

Computational Complexity and Tractability

Introduction

Algorithm design is not only the search for a correct procedure; it is also the study of the resources required to execute that procedure. An algorithm may be correct yet unusable because its running time grows too rapidly, its memory demand exceeds available capacity, or the problem itself may be computationally intractable at scale. Computational complexity provides the language and formal models needed to distinguish these situations.

This chapter focuses primarily on decision problems, polynomial-time reductions, the classes P and NP, NP-completeness, NP-hardness, satisfiability, lower bounds, and parameterized complexity. These ideas support practical decisions: whether to seek an exact algorithm, use approximation, exploit special structure, restrict the input, or accept an exponential method for small instances.

Complexity theory does not say that an NP-complete problem can never be solved. Rather, it explains why a general exact polynomial-time algorithm is considered unlikely and why engineering attention should move toward structure, parameters, approximation, heuristics, or carefully bounded instances.

Learning Objectives

After studying this chapter, you should be able to:

  1. Explain decision, optimization, and search problems and their relationships.
  2. Define time complexity, polynomial time, P, NP, NP-hardness, and NP-completeness.
  3. Construct and interpret polynomial-time reductions.
  4. Explain why satisfiability is central to complexity theory.
  5. Distinguish an algorithmic upper bound from a proven lower bound.
  6. Apply parameterized-complexity concepts such as fixed-parameter tractability.
  7. Select practical solution strategies for difficult computational problems.
  8. Critically evaluate claims about tractability, including claims involving quantum computing or artificial intelligence.

1. Computational Resources and Problem Formulation

An instance is a finite representation of a problem input. Its size, denoted by n, is normally the number of bits or symbols in a reasonable encoding. A computational model specifies the primitive operations available to an algorithm. Complexity results commonly use deterministic or nondeterministic Turing machines, while practical analyses may use RAM models or programming-language operations.

The running time of an algorithm A on input x is written TA(x). Worst-case time is

TA(n) = max{ TA(x) : |x| = n }.

Here, |x| is the encoding length of x. Big-O notation gives an asymptotic upper bound: T(n) = O(f(n)) means that there are constants c > 0 and n₀ such that T(n) ≤ c f(n) for all n ≥ n₀. Big-Ω gives an asymptotic lower bound, and Big-Θ gives a tight asymptotic bound when both apply.

Polynomial time means time bounded by nk for some fixed constant k. The exponent and hidden constants can matter greatly in practice, but polynomial growth is a fundamental theoretical boundary because it is stable under composition and commonly regarded as efficiently scalable. Exponential time, such as 2n, eventually dominates every polynomial, although an exponential algorithm may be practical for small n.

Space complexity measures the amount of memory used in addition to the input representation. Time and space must be interpreted relative to the encoding. For example, an integer value may be small numerically but require many bits if encoded in binary; algorithms whose running time depends on the numerical value rather than its bit length may therefore be pseudo-polynomial rather than polynomial.

2. Decision, Search, and Optimization Problems

A decision problem has a yes/no output. Formally, it can be represented as a language L, a set of encoded strings for which the answer is yes. Examples include:

  • Does a graph contain a clique of size at least k?
  • Is there a schedule satisfying all stated constraints?
  • Does a given integer have a factor smaller than a specified bound?

A search problem asks for a witness or solution, such as the clique, schedule, or factor. An optimization problem asks for the best feasible solution, such as a shortest tour or minimum-cost schedule.

Decision versions are central because they simplify reductions and complexity-class definitions. Under standard conditions, an optimization problem can often be related to its decision version. For example, a minimum-cost value can be found by repeatedly asking whether a solution of cost at most B exists, followed by reconstruction of a solution. This relationship is not automatic for every problem, but it is a powerful design pattern.

A certificate is a compact piece of evidence that allows a yes-instance to be verified efficiently. For a Hamiltonian-cycle problem, a proposed ordering of vertices is a certificate; verification checks that every vertex appears once and consecutive vertices are connected.

3. The Classes P and NP

3.1 Class P

P is the class of decision problems solvable by a deterministic algorithm in polynomial time in the input length. Examples include graph reachability, shortest paths with appropriately represented nonnegative weights, minimum spanning tree, maximum flow, and primality testing.

Membership in P is an upper-bound statement: it demonstrates the existence of an efficient algorithm. It does not claim that every implementation is fast or that polynomial exponents are small.

3.2 Class NP

NP is the class of decision problems for which every yes-instance has a certificate verifiable in polynomial time by a deterministic algorithm. Equivalently, NP is the class decidable in polynomial time by a nondeterministic machine that can guess a certificate and verify it.

The name NP means nondeterministic polynomial time, not “non-polynomial.” Every problem in P is also in NP because a polynomial-time algorithm can solve the problem directly, or a certificate can be ignored. Thus,

P ⊆ NP.

The famous P versus NP question asks whether P = NP. Most complexity theorists believe that P ≠ NP, but this has not been proved. The distinction is important: membership in NP means efficient verification, not necessarily efficient discovery.

3.3 Certificates and verification

Consider Boolean satisfiability. The input is a Boolean formula, and the question is whether some assignment makes it true. A certificate is an assignment. A verifier evaluates each clause and accepts if every clause is satisfied. Evaluation is polynomial in the formula length, so SAT belongs to NP.

This perspective is useful in security and systems engineering. A solution can sometimes be generated by an expensive process but checked cheaply. However, cheap verification does not imply that a valid solution is easy to find.

4. Polynomial-Time Reductions

A polynomial-time many-one reduction from decision problem A to decision problem B, written A ≤p B, is a polynomial-time computable transformation f such that

x ∈ A if and only if f(x) ∈ B.

The transformation preserves the yes/no answer. If B has a polynomial-time algorithm and A ≤ₚ B, then A also has a polynomial-time algorithm: compute f(x), then solve the resulting B instance. Consequently, if a known difficult problem reduces to a proposed new problem, the new problem is at least as difficult as the known problem.

Reduction direction is a frequent source of error. To prove that B is difficult, reduce a known difficult problem A to B, not B to A. Reducing B to A instead shows that B is no harder than A and does not establish hardness for B.

A valid reduction must specify:

  1. The input representation.
  2. The transformation algorithm.
  3. Polynomial running time of the transformation.
  4. Preservation of yes and no instances.

Reductions can also be used positively. If A ≤ₚ B and A is known to be in P, this fact alone says little about B. But if B ≤ₚ A and A is efficiently solvable, then B is efficiently solvable as well.

5. NP-Completeness and NP-Hardness

A decision problem C is NP-complete if:

  1. C belongs to NP.
  2. Every problem in NP reduces to C in polynomial time.

Equivalently, it is sufficient to show that C is in NP and that one established NP-complete problem reduces to C. If any NP-complete problem is in P, then P = NP, because all NP problems reduce to it.

An NP-hard problem is at least as hard as every problem in NP, but it need not itself belong to NP. It may be an optimization problem, a search problem, or even undecidable in some formulations. Therefore, “NP-hard” does not mean “in NP,” and “NP-complete” is not interchangeable with “NP-hard.”

Important NP-complete problems include SAT, 3-SAT, CLIQUE, VERTEX COVER, HAMILTONIAN CYCLE, and the decision form of TRAVELING SALESPERSON. Their practical forms may differ, but reductions establish a common theoretical core.

5.1 The Cook–Levin theorem

The Cook–Levin theorem established that Boolean satisfiability is NP-complete. In broad terms, a computation of a nondeterministic polynomial-time machine can be encoded as a Boolean formula whose satisfying assignments describe valid computation histories. This result was foundational because it provided the first NP-complete problem and a starting point for thousands of later reductions.

5.2 A typical proof pattern: CLIQUE and VERTEX COVER

Given an undirected graph G = (V, E), a clique of size k is a set of k vertices with every pair adjacent. A vertex cover of size t is a set of vertices incident to every edge.

The complement relationship gives a useful transformation. Let Ḡ be the complement graph, containing exactly the edges absent from G. G has a clique of size k if and only if Ḡ has an independent set of size k. Since a set is a vertex cover of size t exactly when its complement is an independent set of size |V| − t, reductions can connect clique, independent set, and vertex cover.

A proof must still establish the construction time and both directions of the equivalence. Intuitive similarity is not enough.

6. Satisfiability and Constraint Formulations

A literal is a Boolean variable or its negation. A clause is a disjunction of literals, and a conjunctive normal form (CNF) formula is an AND of clauses. In 3-SAT, each clause contains three literals, allowing repeated or fewer literals depending on the convention used by a particular formulation.

SAT asks whether an assignment satisfies a Boolean formula. 3-SAT remains NP-complete despite its restricted clause form. This makes it a standard source problem for reductions.

Many practical problems can be expressed as SAT or a related constraint-satisfaction problem:

  • Hardware verification: do control constraints admit an invalid state?
  • Software testing: is there an input reaching a target path?
  • Configuration: can component choices satisfy compatibility rules?
  • Planning: does a sequence of actions achieve a goal?
  • Timetabling: can courses, rooms, and instructors satisfy constraints?

Modern SAT solvers combine conflict-driven clause learning, non-chronological backtracking, watched literals, and branching heuristics. These methods can solve very large industrial instances, especially when the instances contain exploitable structure. Their success does not contradict NP-completeness: worst-case complexity and typical-case performance are different questions.

Integer linear programming, constraint programming, and SMT solving extend the same idea to arithmetic, finite-domain, and theory-specific constraints. A model should be chosen according to the structure of the application, not solely according to the worst-case class.

7. Lower Bounds and the Limits of Analysis

An upper bound describes an algorithm. A lower bound describes what every algorithm in a specified model must require. For comparison-based sorting, Ω(n log n) comparisons are necessary in the worst case. The argument uses a decision tree: n! possible input orders require at least n! leaves, so the tree height is at least log₂(n!). Since log₂(n!) = Ω(n log n), comparison sorting has the stated lower bound.

This lower bound depends on the comparison model. Integer sorting can exploit the representation of keys and may achieve different bounds under restrictions on word size and key range. Thus, lower bounds are always model-dependent.

Other lower-bound techniques include adversary arguments, information-theoretic arguments, communication complexity, reductions, and cell-probe analysis. A reduction-based lower bound can show that an efficient algorithm for one problem would imply an efficient algorithm for a problem believed to be difficult. Conditional lower bounds often rely on assumptions such as P ≠ NP, the Exponential Time Hypothesis, or conjectures about fine-grained complexity.

It is essential to distinguish:

  • A proof that one implementation takes Ω(n²) time.
  • A proof that every algorithm in a model takes Ω(n²) time.
  • A conjecture that no polynomial algorithm exists.
  • An empirical observation that current solvers perform poorly.

These are not equivalent claims.

8. Tractability Beyond P and NP

Worst-case polynomial time is a strong general-purpose notion of tractability, but it is not the only useful one. Several additional perspectives matter.

8.1 Pseudo-polynomial algorithms

An algorithm is pseudo-polynomial if its running time is polynomial in the numerical value of an input parameter but not necessarily in its encoding length. The dynamic-programming algorithm for 0/1 knapsack with capacity W runs in O(nW) time. If W is encoded in binary, its bit length is only about log₂W, so O(nW) is not polynomial in the input length in general.

8.2 Approximation algorithms

For a minimization problem, an algorithm is a ρ-approximation if its solution cost is at most ρ times the optimum, where ρ ≥ 1. For a maximization problem, the usual guarantee is that the solution value is at least OPT/ρ. Definitions must be stated carefully because approximation ratios differ by problem type.

Approximation is valuable when exact optimization is intractable and bounded quality is preferable to an unpredictable heuristic. Some NP-hard problems admit a polynomial-time approximation scheme, or PTAS, which for every fixed ε > 0 produces a solution within a factor 1 + ε for minimization problems, with running time polynomial in input size for fixed ε. A fully polynomial-time approximation scheme, or FPTAS, is also polynomial in 1/ε.

8.3 Average-case and smoothed analysis

Worst-case complexity may overstate the cost of ordinary instances, while average-case analysis requires a justified probability distribution. Smoothed analysis studies performance after small random perturbations and can explain why algorithms with poor worst-case bounds work well in practice. These analyses must not silently replace a worst-case claim with an unsupported empirical generalization.

9. Parameterized Complexity

Classical complexity measures input size n alone. Parameterized complexity additionally identifies a parameter k representing the source of difficulty: solution size, treewidth, number of defects, or another domain quantity.

A problem is fixed-parameter tractable (FPT) with respect to k if it can be solved in time

f(k) · nc,

where f is any computable function depending only on k and c is a constant independent of k and n. For a fixed small k, the dependence on n is polynomial. This is often preferable to an algorithm such as n^k, which is not FPT because the exponent depends on k.

For example, Vertex Cover can be solved by branching: choose an uncovered edge (u, v), then branch on including u or including v. After k levels, at most 2^k branches are explored, and polynomial work is done per branch. The resulting bound is approximately O(2^k · (n + m)), where n is the number of vertices and m the number of edges. Thus Vertex Cover is FPT when parameterized by cover size k.

Other parameterized tools include kernelization, bounded-search trees, tree decompositions, and dynamic programming over structural width. A kernelization algorithm transforms an instance (I, k) in polynomial time into an equivalent instance with size bounded by a function of k. Kernelization is both a theoretical compression and a practical preprocessing strategy.

Parameterized complexity also identifies hardness classes such as W[1]. If a problem is W[1]-hard under a standard parameterization, an FPT algorithm is considered unlikely, although this is conditional rather than an absolute impossibility result.

9.1 Choosing a useful parameter

A parameter should be:

  • Small or bounded in the intended application.
  • Computable or estimable cheaply.
  • Meaningfully related to difficulty.
  • Stable under the chosen reduction or decomposition.

A poor parameter can make an elegant theoretical result operationally irrelevant. Conversely, a domain-specific parameter—such as the number of exceptions in a mostly regular network—can turn a difficult general problem into a tractable operational one.

10. Practical Strategy for Difficult Problems

When confronted with a computationally difficult task, use the following workflow:

  1. Formalize the input, output, encoding, and feasibility constraints.
  2. Identify whether the problem is decision, search, optimization, or counting.
  3. Look for known polynomial algorithms and special graph or algebraic structure.
  4. Test whether the problem is a known NP-complete or NP-hard variant.
  5. Select a response: exact exponential algorithm, dynamic programming, parameterized method, approximation, heuristic, randomized algorithm, or solver encoding.
  6. State guarantees, assumptions, and failure modes.
  7. Benchmark on representative and adversarial instances.
  8. Monitor solution quality, timeouts, memory, and reproducibility.

This workflow prevents a common professional error: applying a generic brute-force algorithm to a large instance without first determining whether the problem contains exploitable structure.

11. Illustrative Case: University Examination Timetabling

Background

A university must assign examinations to time slots and rooms. Each student may take several examinations, and no student can sit two examinations simultaneously. Rooms have capacities, some courses require specialist facilities, and spacing rules may reduce student stress.

Problem

The institution wants a feasible timetable and, if possible, one minimizing conflicts, room wastage, and undesirable consecutive examinations. The general optimization problem combines assignment and resource constraints and can encode graph-coloring-like subproblems.

Analysis

Construct a conflict graph whose vertices are examinations. An edge joins two examinations sharing at least one student. Assigning time slots is then a graph-coloring problem: adjacent vertices must receive different colors. Graph coloring is NP-hard in its optimization form, so a universal exact polynomial-time method should not be expected.

However, the real instance may have useful parameters: the number of time slots may be fixed, the conflict graph may be sparse, departments may form clusters, and only a small number of courses may have unusual constraints.

Approach

A practical hybrid solution can use the following stages:

  1. Preprocess enrollment data and construct the conflict graph.
  2. Apply graph decompositions and remove isolated or low-degree examinations.
  3. Use a constraint solver or SAT encoding for hard feasibility constraints.
  4. Apply parameterized or dynamic programming methods to small departmental components.
  5. Use local search to improve soft objectives after feasibility is reached.
  6. Retain the best solution found, together with a certificate that all hard constraints hold.

Outcome

The institution obtains a valid schedule without claiming that the global optimization problem has been solved optimally. The solver can report a lower bound, an incumbent schedule, and an optimality gap when supported by the optimization framework. If a strict deadline exists, a time limit and fallback schedule are preferable to an unbounded exact search.

Learning Points

The case illustrates the difference between feasibility and optimization, the value of reductions to graph models, the usefulness of parameterization and decomposition, and the importance of reporting guarantees honestly. It also shows that NP-hardness informs engineering strategy rather than ending the analysis.

12. Contemporary and Professional Considerations

Artificial-intelligence systems can assist with heuristic search, branching-variable selection, schedule construction, and learned instance classification. They do not automatically remove worst-case complexity. A learned heuristic should be evaluated against distribution shift, adversarial instances, reproducibility requirements, and the cost of incorrect decisions.

Cloud computing and parallelism can reduce practical runtime, but parallel execution does not generally convert an exponential algorithm into a polynomial one. In safety-critical or regulated systems, solver outputs need traceability: inputs, model versions, constraint definitions, objective priorities, solver settings, and infeasibility explanations should be retained.

Security also depends on complexity assumptions. Public-key cryptography relies on computational problems believed to be hard for classical computers, but “hard” is assumption- and model-dependent. Quantum algorithms change the landscape for some problems, such as integer factoring, but do not imply that all NP-complete problems become efficiently solvable. Claims about quantum advantage must specify the computational model, input access, error model, and resource accounting.

Challenges and Limitations

Complexity classes abstract away constants, hardware, data locality, parallelism, and input distributions. A polynomial algorithm can be impractical, and an exponential algorithm can be useful for small or highly structured instances. NP-completeness is a worst-case classification; it does not predict the exact performance of every instance or solver.

Reductions can also obscure practical structure. A problem may be NP-complete in general but easy on planar graphs, trees, bounded-treewidth graphs, or instances with a small parameter. Conversely, a theoretically elegant parameter may be too large in production. Sound professional judgment therefore combines formal guarantees with empirical evidence and domain knowledge.

Best Practices

  • Specify the computational model and input encoding.
  • Separate worst-case, average-case, and observed performance claims.
  • Verify reduction direction and both logical implications.
  • Distinguish NP-hardness from NP-completeness.
  • Report approximation ratios, parameter dependence, and resource limits.
  • Exploit preprocessing, decomposition, sparsity, and small parameters.
  • Use exact solvers when certificates and guarantees justify their cost.
  • Use heuristics only with transparent quality and failure reporting.
  • Preserve reproducible models, data, and solver configurations.

Chapter Summary

Computational complexity studies the resources required to solve problems as input size grows. Decision problems provide a rigorous basis for defining P and NP, while certificates explain why NP problems have efficiently verifiable yes-solutions. Polynomial-time reductions transfer algorithmic difficulty and form the foundation of NP-completeness proofs. SAT is NP-complete and serves as a universal language for expressing many practical constraint problems.

NP-hardness does not prove that a problem is impossible to solve, nor does it imply that every instance is difficult. It indicates that general exact polynomial-time solutions are unlikely under widely held assumptions. Lower bounds must be interpreted relative to a computational model, and conditional lower bounds must be distinguished from unconditional theorems.

Practical tractability may arise through pseudo-polynomial algorithms, approximation, average-case behavior, structural restrictions, or parameterized algorithms. Fixed-parameter tractability separates dependence on a small parameter k from polynomial dependence on the total input size. In professional practice, complexity analysis guides the choice among exact algorithms, solvers, approximation, heuristics, decomposition, and resource-bounded computation.

Key Terms

Decision problem: A problem whose answer is yes or no.

Certificate: Evidence for a yes-instance that can be verified efficiently.

P: Decision problems solvable in deterministic polynomial time.

NP: Decision problems with polynomial-time verifiable certificates.

Reduction: A transformation converting instances of one problem into another while preserving answers.

Polynomial-time reduction: A reduction computable in time polynomial in input length.

NP-complete: A problem in NP to which every NP problem reduces polynomially.

NP-hard: A problem at least as hard as every problem in NP; it need not belong to NP.

SAT: The Boolean satisfiability problem.

CNF: Conjunctive normal form, an AND of OR-clauses.

Upper bound: A bound demonstrated by a particular algorithm.

Lower bound: A resource requirement applying to all algorithms in a specified model.

Pseudo-polynomial: Polynomial in numerical values but not necessarily in encoding length.

Approximation algorithm: An algorithm with a provable bound relative to an optimum.

Parameterized complexity: Analysis based on input size and a separate difficulty parameter.

FPT: Fixed-parameter tractable time of the form f(k) · n^c.

Kernelization: Polynomial preprocessing that produces an equivalent instance bounded by a function of the parameter.

Tractability: The practical or theoretical feasibility of solving a problem within acceptable resources.

Review Questions

Short Answer Questions

  1. What is the difference between a decision problem and an optimization problem?
  2. Why is every problem in P also in NP?
  3. State the two conditions required for a problem to be NP-complete.
  4. Why is reduction direction important in an NP-hardness proof?
  5. What distinguishes an FPT running time from an n^k running time?

Long Answer Questions

  1. Explain certificates, verification, and nondeterminism using SAT as an example.
  2. Describe the Cook–Levin theorem and its significance for complexity theory.
  3. Compare NP-hardness and NP-completeness, including examples of problems that may be NP-hard but not in NP.
  4. Explain comparison-based sorting lower bounds using a decision-tree argument.
  5. Discuss how approximation, parameterization, and decomposition can produce useful solutions to NP-hard problems.

Analytical / Application Questions

  1. A scheduling problem is modeled as graph coloring. Explain how the graph should be constructed, what the colors represent, and why the optimization version is difficult. Identify at least two exploitable parameters.
  2. An algorithm runs in O(nW) for a knapsack instance where W is binary encoded. Is this necessarily polynomial in the input length? Justify your answer.
  3. You reduce a known NP-complete problem B to a new problem C and show the transformation is polynomial. What additional argument is needed to conclude that C is NP-complete?

Multiple Choice Questions with Answers

Question 1

Which statement best defines class NP?

A. Problems solvable only by exponential-time algorithms

B. Problems whose yes-instances have certificates verifiable in polynomial time

C. Problems that require nondeterministic hardware in practice

D. All optimization problems with polynomial objective functions

Correct Answer: B. Problems whose yes-instances have certificates verifiable in polynomial time

Question 2

If A ≤ₚ B and B has a polynomial-time algorithm, what follows?

A. A has a polynomial-time algorithm

B. B is necessarily NP-complete

C. A is necessarily harder than B

D. A cannot be verified efficiently

Correct Answer: A. A has a polynomial-time algorithm

Question 3

Which condition is NOT required to prove that a decision problem is NP-complete?

A. The problem belongs to NP

B. A known NP-complete problem reduces to it in polynomial time

C. Every practical instance must be difficult

D. The reduction preserves yes and no answers

Correct Answer: C. Every practical instance must be difficult

Question 4

For an FPT algorithm with parameter k, which running-time form is appropriate?

A. n^k

B. 2^n · k

C. f(k) · n^c for a constant c

D. k^n

Correct Answer: C. f(k) · n^c for a constant c

Question 5

Why is O(nW) for binary-encoded knapsack capacity W generally pseudo-polynomial?

A. W is always constant

B. The numerical value W can be exponential in its encoding length

C. n is not part of the input

D. The algorithm uses no arithmetic operations

Correct Answer: B. The numerical value W can be exponential in its encoding length

Question 6

What does NP-hard mean?

A. The problem is definitely undecidable

B. The problem is in NP and has a short certificate

C. Every problem in NP reduces to the problem in polynomial time

D. The problem has no practical algorithms

Correct Answer: C. Every problem in NP reduces to the problem in polynomial time

Question 7

Which is a valid certificate for a Hamiltonian-cycle decision instance?

A. A list containing a proposed ordering of all vertices

B. The graph's average degree only

C. A random edge selected from the graph

D. The number of connected components without further information

Correct Answer: A. A list containing a proposed ordering of all vertices

Question 8

A comparison-sorting lower bound is primarily dependent on which assumption?

A. Keys are accessed only through comparisons

B. All keys are distinct real numbers with bounded range

C. The algorithm is randomized with no probability model

D. The input is already sorted

Correct Answer: A. Keys are accessed only through comparisons

Question 9

What is the main purpose of kernelization in parameterized complexity?

A. To replace a decision problem with an optimization problem

B. To create an equivalent smaller instance bounded by a function of the parameter

C. To prove that P equals NP

D. To remove the parameter from the input

Correct Answer: B. To create an equivalent smaller instance bounded by a function of the parameter

Question 10

Why can modern SAT solvers perform well on large industrial instances despite SAT being NP-complete?

A. NP-completeness applies only to numerical problems

B. Worst-case complexity does not prevent exploiting structure in typical instances

C. SAT has been proved to belong outside NP

D. SAT solvers always use polynomial-time algorithms

Correct Answer: B. Worst-case complexity does not prevent exploiting structure in typical instances

Advanced Data Structures & Algorithms
Chapter 11 of 15