COSC 202: Course Objectives
Intellectual Rationale
An algorithm, most simply put, is a sequence of steps to solve a problem. The design and analysis of algorithms lies at the heart of computer science: a general-purpose computer is a powerful tool, able to solve many computational problems, but in order to do so it requires an unambiguous, precise explanation of what computational steps to execute. The correctness and efficiency of our computer algorithms are paramount, especially given that we increasingly rely on the results of computer algorithms in everyday life, and we ask computers to examine increasing amounts of data to obtain those results.
This course intends to establish a foundation for good algorithm design and analysis, equipping students with techniques to solve a variety of problems efficiently and to evaluate the correctness and performance of those techniques. The techniques covered in this course can be applied to many computational tasks, whether in the field of computer science or beyond. Students are also taught to recognize problems that computers have difficulty solving efficiently and methods to cope with that difficulty. Because many computational tasks involve some level of information processing, the course will also study different data structures, which are schemes to organize information so that important questions about it can be answered efficiently. Proper selection and use of data structures is required to reduce the complexity of an algorithm, both from the perspective of a computer in terms of efficiency and from the perspective of a human in terms of coherence when describing a computational procedure.
The course is targeted towards computer-science majors and minors: The data structures and algorithms studied are foundations for problem-solving seen throughout the field at more advanced levels. It relies on the introductory programming sequence (COSC 101 and 102) for software development fundamentals and concepts such as data encapsulation. Many students who take COSC 102 and enjoy its problem solving may enjoy taking this course even if they do not intend to major or minor; their problem solving and programming will undoubtedly improve, as will their logical reasoning. The foundations established in this course, especially when combined with those in the new Introduction to Systems (COSC 208) or Discrete Structures (COSC 290) courses, enable better advanced study of many topics in computer science. The topics studied in this course cover most of the core topics in the “Algorithms and Complexity” knowledge area, and some topics in the “Discrete Structures” and “Software Development Fundamentals” knowledge areas, as mapped out in the Association for Computing Machinery (ACM) and Institute of Electrical and Electronics Engineers (IEEE) Computer Society Joint Task Force on Computing Curricula’s Computer Science Curricula 2013: Curriculum Guidelines for Undergraduate Degree Programs in Computer Science. This represents (depending on the exact mapping) between 9–15% of the recommended core hours of an undergraduate CS program, amounting to around 1/8 of the curriculum. In addition, many of the other knowledge areas outlined in the curriculum report rely on foundations established through this course.
Learning objectives
In this course, you will learn how to:
- Use asymptotic notation and the concepts of time and space complexity to evaluate the efficiency of a computer algorithm.
- Identify appropriate data structures to organize information used in the course of solving a computational problem.
- Implement the operations of common data structures in an object-oriented programming language.
- Propose an efficient solution to several types of computational problems by recognizing which algorithmic strategy (e.g., greedy, divide-and-conquer, dynamic programming) is most appropriate.
- Justify the correctness of an algorithm if it uses one of the approaches studied in the course (including termination and/or optimality as appropriate), or identify counterexamples that demonstrate failure cases.
- Write and test the implementation of a solution to an algorithms problem in an object-oriented programming language.
- Use graphs to model relationships between pieces of data, and apply the graph algorithms studied in the course to analyze those relationships.