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.
Semester schedule — tentative - see Canvas for up-to-date details.
Online Resources — textbooks, tools, notes, readings, and other resources will be posted here. I will link to relevant entries from Canvas, but it doesn't hurt to browse and see what else is there.
The "primary" but optional textbook, whose organization I will be following and from which I will be drawing a decent amount of material is The Design & Analysis of Algorithms by Anany Levitin; however it is not required for the course.
| Title | Introduction to the Design and Analysis of Algorithms (3rd edition) |
|---|---|
| Author | Anany Levitin |
| ISBN | 0132316811 |
I like its organization and feel it has good, clear explanations. However, the topics in this course are covered quite well in a wide range of resources that are freely available online. I will provide free, online sources for all of the concepts we cover in class. You will never absolutely need the textbook, and I will make sure that any exercises I use from it are reproduced in the assignment.
Therefore, you can buy the primary textbook or you can use the relevant readings and explanations for anything we cover online. I will strongly encourage you to use these other resources whether you have the book or not. Owning the book, or another textbook, will give you an easy "one-stop" source, however.
Some material will not be in the primary textbook at all (primarily parallel algorithms), and I will provide online resources for those, just like everything else.
It may be worthwhile to get together with other people in the course and buy or borrow two or three different textbooks to share. I've found study groups to be incredibly useful for this sort of material, and sharing textbooks is a natural extension of that. I will suggest other books here, if you're interested in this approach.
One option, with good explanations and a lot of motivating real-world examples of algorithm design and analysis:
| Title | The Algorithm Design Manual |
|---|---|
| Author | Steve Skiena |
| ISBN | 9781848000698 |
A decent textbook for much of the parallel algorithms content:
| Title | Algorithms: Sequential, Parallel, and Distributed |
|---|---|
| Author | Kenneth A. Berman and Jerome L. Paul |
| ISBN | 9780534420574 |
And finally, a very well-known, highly-respected, and quite dense book that is probably good for any computer scientist to have on his or her bookshelf:
| Title | Introduction to Algorithms (3rd edition) |
|---|---|
| Author | Cormen, Leiserson, Rivest, and Stein (the book is commonly referred to as "CLRS") |
| ISBN | 9780262033848 |
Algorithms are language agnostic. They 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. You'll be writing working code in this class, though, and for that you need to use a programming language.
Some parts of the course require a particular language (e.g., we have MPI bindings setup for C++ and Python only), and for the rest, you will use it to learn a new language. In particular, you will learn and use Java if you don't have much experience with it yet. If you already feel competent in Java, though, come talk to me, and we can potentially choose a different language for you to use for assignments. I am happy to help you, at any point, with code written in any language, whether it's a programming assignment or just something you wrote up to explore a concept. Some I know better than others, of course.
Overall, we can be flexible in this class, 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 roughly on the following breakdown:
| Assignments | 15% |
| Exam 1 | 25% |
| Exam 2 | 25% |
| Final Exam | 30% |
| Engagement | 5% |
Assignments will be posted on Canvas, usually about a week before they are due, and they will be collected there as well. Submissions should be in the form of PDF documents.
Assignments will be due at set times; they will be considered late at any point after that time. An assignment will lose 10% of the total possible points for every day or partial day it is late, and after five days it will not be accepted.
Assignments can't be accepted at all after solutions have been handed out or the graded work has been returned to the class.
Every student has two "grace tokens" that they may use for extensions in instances where they are unable to complete work by the assigned deadline. To use a grace token on an assignment, send me an email before the assignment deadline, explain why you need an extension, and we will determine an appropriate extension, which will be granted with no grade penalty. Some assignments may not be eligible for grace tokens due to immediate use of or feedback on the submitted work, but most will be.
There will be two exams during the semester plus a final. The second exam will primarily focus on the material seen since the first exam. The final will be cumulative. See the schedule for exam dates.
If you would like to request a regrade, submit a request to me in writing (via email) within one week of receiving the graded item. Indicate exactly which part you believe deserves a different score and why.
Class time will be complementary to the reading, and you will need both in order to learn all of the material in this class. Many class sessions will involve material and/or practice that you will not be able to find or make up elsewhere. Furthermore, each student benefits from the engagement of all others in the class. Part of your final grade will be based on that engagement. Attending every class period on time and prepared will earn a base of 70%; points can be gained by constructive participation, in class or out, such as asking questions, answering them, responding on Piazza or Discord, sharing insights or useful/interesting resources with the class (posting on Discord, for example), investigating concepts beyond the requirement in class, working on small independent learning projects, and in many other ways. Points can be lost for excessive (more than 3) unexcused absences, disrupting class (e.g., regularly showing up late), poor participation in group exercises, 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 a week in advance. In general, if you know you will be missing a class, let me know as soon as you can.
If any concept, piece of code, compiler error, or anything else related to this course is ever unclear to you, please come see me during my office hours. One-on-one, I can help you bridge the gap from what you do understand to what you want to understand. It will generally be the easiest, fastest way to clarify something.
If you cannot attend any of my regularly scheduled office hours, I'm more than happy to setup another time to meet. Just let me know.
And to make sure that misunderstandings and difficulties do not go unaddressed, I will often ask that anyone who receives a C- or below on any assignment or exam come see me to see what we can do about improving that going forward.
I strongly encourage you to form study groups with your classmates, compare notes, explain concepts to one another, and generally help each other learn the material in this course.
Additionally, in this course, collaborating with other students on assignments and using generative AI tools (like large language models) on assignments is allowed. I will lay out the reasoning for this in class. It is a bit of an experiment, however, and if it leads to poor outcomes for students at some point during the semester, I will change the policy then.
Important: Submitting any work done by someone or something else without clearly citing them as a source is still plagiarism. In every assignment, you must clearly and accurately state the type and scope of assistance you received and who / what you received it from.
Also important: Doing the work to complete assignments is how you learn a lot of the material in this class, and if you do not do that work yourself, you will not learn much. That will be reflected in your exam grades, in your ability to succeed in later courses, and in your knowledge and skills after graduation. You are responsible here for ensuring you do enough work to learn the material. Be mindful of that, and don't let yourself take shortcuts that skip the learning and harm you later.
Exams and anything that is explicitly stated to be individual work must be completed without collaborating with others, sharing or looking at solutions, or using generative AI.
For details on the university's policies regarding academic integrity, please read the University Policies Concerning Student Conduct & Academic Integrity. Academic misconduct can result in failing the course and a report to the associate provost. If you are ever unsure of whether something might be crossing that line, please err on the side of caution. You can also just ask me, and I'll be happy to provide guidance.
Illinois Wesleyan University strives to make all learning experiences as accessible as possible. If you anticipate or experience academic barriers based on a disability (including mental health and chronic or temporary medical conditions), it is your responsibility to self-disclose and provide documentation to the Office of Student Accessibility Services. Please note that accommodations are not retroactive and accommodations cannot be provided until I receive an email from Student Accessibility Services. Once the email is sent, please make arrangements with me as soon as possible to discuss your accommodations confidentially so they may be implemented in a timely fashion. For more information contact Student Accessibility Services by e-mailing accessibility@iwu.edu or stopping by their office in Holmes Hall.
Our university's mission statement includes, "The University through our policies, programs and practices is committed to diversity [...]" Our school and this course are made stronger by the mix of people that come into it bringing a diversity of ideas, experiences, and backgrounds. I expect everyone in this course — instructor, TA, and student — to contribute to an inclusive atmosphere that respects the diversity of all others in it. Dimensions of diversity can include sex, race, age, national origin, ethnicity, gender identity and expression, intellectual and physical ability, sexual orientation, income, faith and non-faith perspectives, socio-economic class, political ideology, education, primary language, family status, military experience, cognitive style, and communication style. The individual intersection of these experiences and characteristics must be valued in our community. If you have related concerns about the class environment or behavior of any in it (including me), you are welcome to raise them with me, and I will do my best to address them. If you are not comfortable speaking with me about them, you may also bring concerns to the Associate Provost.
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 such things are, in my opinion, very helpful learning tools. The online resources link to many others. Supplement our time in class and the book, if you have it, with resources on the web. I will provide links to some resources I think are valuable, but you should go out and find more as well. 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 or sending me an email!