Algorithm design is a fundamental intellectual undertaking of computer science. Before writing a computer program to solve a complex problem such as routing packets on the Internet, computing the similarity between two DNA sequences, or scheduling final exams at a university, a computer scientist must first design an algorithm. The typical design process consists of:
In some cases, the designer cannot find any efficient algorithm that solves the problem. Another important part of the design process is proving that some problems are intractable. Students will also learn the theory of NP-completeness and computational intractability.