• PREREQUISITE: An undergrad course in discrete mathematics. One year's experience in some high-level computer language and familiarity with recursive programming and basic data structures (arrays, pointers, stacks, queues, linked lists, binary trees).
  • This course emphasizes analysis, correctness and efficiency of algorithms. As such, it is relatively mathematical and rigorous. Students are expected to work hard on this.
  • An important aspect of analysis is on solving recurrences. You will learn asymptotic notations (Big-Oh, etc).
  • Basic algorithms to know include balanced binary trees, sorting and selection, hashing, graph traversal, graph connectivity, breadth-first and depth-first searches, spanning tree, shortest paths.
  • Computational techniques include divide-and-conquer, greedy method, and dynamic programming.
  • Depending on time, we add some advanced topics such as: randomized algorithms, amortization, primality and cryptographic applications, and computational geometry.
  • The capstone of the course is a brief introduction to NP-Completeness Theory.