This is a broad graduate level introductory course on efficient algorithms and data structures addressing problems commonly encountered in engineering and computer science. We will emphasize complexity analysis of algorithms. The aim of the course is to bring you a point where, when you come across an engineering and/or research problem, you:
can identify the computational complexity class of the problem
can integrate them into an efficient algorithm and analyze the performance of your solution.
The breakdown of your course grade is as follows.
Weekly problem sets: 25 %
Two midterm examinations: 15 % each
Final examination: 25 %
Project: 20 %
Any duplication in problem solutions or your project will be prosecuted to the fullest extent allowed by university policy regarding academic dishonesty.
Weekly Problem Sets
Each week, you will be assigned a set of problems. Solving these problems and writing the solutions down on your own, without referring to the solutions or other people will be the best way to prepare for the examinations.
You are encouraged to discuss problems with your classmates and to consult other sources. However, trying to solve problems on your own is a very important learning tool for this course, and you are recommended to approach this matter very seriously.
You will be required to carry out a programming project for this course. This project will give you the opportunity to use and integrate the algorithms, data structures and analysis methods that you learn in this course. The project will be due the week of the final examinations and will be carried out individually.
Sometime near the middle of the semester, you will be given a detailed handout explaining the problem you are asked to solve. You will be free to use any programming language and platform, and any standard data structure and algorithm implementations available as libraries. Your grade will be based on the performance of your program on a number of benchmarks, as well as a project report in which you analyze your solution.