Algorithms are everywhere in CS — every program is an algorithm. Some algorithms warrant closer attention: those that are used and reused frequently, that are critical for an application's performance, or that solve important problems in CS in particularly elegant ways. These algorithms are often tightly coupled with particular data structures. This course examines algorithms and their data structures with an eye towards analyzing their efficiency and designing new algorithms in similarly efficient ways.
The fundamental goal of this course is to give you:
For an idea of the specific topics covered in the course, see the rough schedule for the semester.
When/Where: MWF 1:00-1:50PM / CNS E210
Instructor: Mark Liffiton
Office: CNS C207B
Office Hours: MWF 10-11; TR 11-12; (by appointment only: MW 2-3)
Contact: Email is preferred (please start the subject with "CS255:"). For more pressing matters, my office # is 309-556-3535.
TA: Jeremy Kings
Office Hours: MTW 8-10pm, CNS E201
Contact: jkings@iwu.edu
Textbook: Foundations of Computer Science / C Edition by Alfred Aho and Jeffrey Ullmann
ISBN: 0716782847
Semester schedule — tentative - see the Moodle for up-to-date details.
Online References — some will be assigned reading, others provide alternative sources or general reference.
Moodle — assignments, quizzes, announcements, and other online resources will be here.
We will primarily be using the C programming language in this class. The C language, along with its features such as explicit memory allocation/deallocation and directly-accessible pointers, is an important language to know for later courses (such as operating systems) and large segments of industry (such as operating systems... okay, and game programming).
That said, the content of the course, the study of algorithms, is entirely language neutral. Algorithms themselves can be, and generally are, designed and analyzed in pseudocode, outside of the confines of any real programming language. Furthermore, any algorithm we study here can be implemented in any Turing Complete language.
Therefore, we will learn C and use it in class and in assignments, but there is plenty of room for other languages as well. I have a few proposals for how we can work with this freedom:
With such a small class, we have some flexibility, and I am open to your ideas on how we can make it as educational and enjoyable as possible.
The final grade will be based on the following breakdown:
Assignments | 25% |
Exam 1 | 20% |
Exam 2 | 20% |
Final Exam | 25% |
Engagement | 10% |
Assignments will be posted on the course's Moodle site, usually about a week before they are due, and they will be collected there as well. Submissions should be in the form of plain text or PDF* for writing assignments, or .tar.gz archives for programming assignments. I will describe the expectations for submitting .tar.gz files in the assignment. I will aim to get them graded and returned to you by the following week.
Your lowest assignment score will be dropped.
Assignments will be due at set times; they will be considered late at any point after that time. An assignment will lose 20% of the total points for every day it is late.
Assignments can't be accepted at all after solutions have been handed out or the graded work has been returned to the class.
There will be two exams during the semester. The final is currently scheduled for Friday, December 11, from 8:00am - 10:00am.
As you may have heard from other teachers: If everyone does well, that's great! I'm not going to lower anyone's grade to fit some predetermined grade distribution. However, scores given on individual quizzes and exams (especially exams) may not translate directly into a letter grade on the traditional scale. As explained quite well here:
"A percentage shows how much of a particular exam was dealt with successfully, but what test is so perfect that it could completely determine extent of knowledge or ability? If a student gets a grade of 90%, it does not mean they know 90% of everything in the subject. Wise students will begin to look at scores as a place on a continuum of achievement rather than analysis carved in stone."
If you would like to request a regrade, submit a request in writing (via email) within one week of receiving the graded assignment, exam, etc. Indicate exactly which part you believe deserves a different score and why.
With such a small group, we have a great opportunity for having a very active class — "active" in the sense that you can be active participants as opposed to passive observers. Each student benefits from their own egagement as well as that of all others in the class. Ten points of your final grade will be based on your engagement. Attending every class period on time and prepared will earn a base of 7 points; points can be gained by constructive participation, in class or out, such as asking questions, answering them, responding in the forum, sharing insights or useful/interesting resources with the class (posting in the forum, for example), etc.; and points can be lost for excessive (more than 3) unexcused absences, disrupting class (e.g., regularly showing up late), dominating the conversation, and the like.
Absences can be excused with documentation from health services or the Dean of Students' office, or if arrangements are made with me more than a week in advance. In general, if you know you will be missing a class, let me know as soon as you can.
I strongly encourage you to form study groups with your classmates, compare notes, explain things to one another, and generally help each other learn the concepts in this course.
Any material turned in for a grade must be your own individual work, though. You may work on concepts with other students, but I ask that you not discuss assigned problems until after the work has been turned in. This has two goals: 1) let the grades be a reflection of each student's own work, and 2) avoid situations where one person solves a problem and another records the answer without really learning. I understand that the line between discussing concepts and solving problems can be vague, so I ask that you use your own judgement with those two goals in mind or ask me if a situation is still unclear.
Try to follow this rule of thumb: No matter what help you received figuring out the concepts involved, when you turn something in you should be able to reproduce the whole thing without any outside help by working through the assignment again.
For details on the university's policies regarding academic honesty, please read the sections of the student handbook on conduct, cheating, and plagiarism here.
Use the web. The topics in this course are covered widely in a great variety of resources online. The Youtube video above is just one example, and it is, in my opinion, a very helpful learning tool. The textbook itself is another example. Supplement the book and our time in class with resources on the web. I will provide links to some resources, but you should go out and find more, also. Search the whole web for a topic and see what comes up; use wikipedia (which will likely rate highly in the web search anyway) to get another view and to see links to related concepts; do a video search (or head straight to youtube) for visualizations or lectures; check out course websites for algorithms classes at other universities... Every single one of these will turn up something good. And when you find something that helps you, share it with the rest of us by posting in the forum on Moodle or sending me an email!