Algorithms (810:270), Spring 2004
Time and Place: 2:00-3:15 Tuesday and Thursday in Wright 105
Instructor: Mark Fienup (firstname.lastname@example.org)
Office: 321 Wright Hall
Office Hours: M 9:30-11, 2-3; T 9:30-11; W 9:30-11, 2-3; Th 9:30-11; F 10-11
Text: Foundations of Algorithms using C++ Pseudocode, Richard Neapolitan and Kumarss Naimipour, third edition 2004.
Prerequisites: You must have a working knowledge of some procedural type programming language (C, C++, Ada, Pascal, Java, etc.) that supports recursion. Ideally, you should have successfully completed an undergraduate algorithms course (like UNI's 810:153), but I'll try to make this course fairly self-contained. This necessitates some overlap/review with an undergraduate course. However, the pace and depth of duplicated topics will be more demanding here. Much of this course contains mathematical notation which may cause you difficulty. If this occurs, see me ASAP to correct the problem.
Course Goals: After this course, you should be able to (1) analyze an algorithm to determine its asymptotic complexity (expected run-time behavior as the problem size grows), (2) design solutions to problems by using classical problem solving techniques, (3) select an efficient algorithm for a specific problem if one exists, and (4) be able to apply appropriate techniques to find a solution to a problem when no efficient algorithm can be found (intractable problems). The problem solving techniques are brute force, divide-and-conquer, dynamic programming, and greedy algorithms. To solve intractable problems we will look at the techniques of backtracking, branch-and-bound, and approximation algorithms. Along the way, you should gain an intuitive understand of the concepts of computational complexity, intractability, and the theory of NP. Time permitting we may have an introduction to parallel algorithms.
Pedagogic Approach: In the first part of the course we will focus on being able to apply the problem solving techniques and fully understanding recursion. Then, we will change gears and work on analyzing the asymptotic complexity of the algorithms and selecting the appropriate problem solving technique for a specific problem. After this, we switch from analyzing individual problems to analyzing the computational complexity for classes of problems, such as sorting and searching. The remainder of the semester will be spent studying intractability, the theory of NP, approximation algorithms for NP-hard problems, and (time permitting) parallel algorithms.
Grading policy: There will be three tests (including the final) on the dates indicated below, so mark these dates on your calendar NOW! Tentative weighting of course components is:
In-class Participation: 5 %
Assignments: 20 %
In-class Test 1: 25 % (March 4)
In-class Test 2: 25 % (April 15)
Final: 25 % (1-2:50 PM Wednesday, May 5)
Grades will be assigned based on straight percentages off the top student score. If the top student score is 92%, then the grading scale will be, i.e., 100-82 A, 81.9-72 B, 71.9-62 C, 61.9-52 D, and below 52 F. Plus and minus grades will be assigned for students near cutoff points.
Special Notice: The Americans with Disabilities Act of 1990 (ADA) provides protection from discrimination for qualified individuals with disabilities. Students with a disability, who require assistance, will need to contact the Office of Disability Services (ODS) for coordination of academic accommodations. The ODS is located at 213 Student Services Center. Their phone number is (319) 273-2676.