Spring 2022
-->

syllabus

info

• Algorithms and Data Structures
• Dates: Feb 15 - May 276 2022
• Time: Mon & Thu 1:40 - 3:30pm
• CS4378.01
• faculty : Jim Mahoney
• max enrollment : 20
• may not be repeated for credit

A survey of the most common patterns of storing digital information and the recipes to search, process, and access that information. Topics include data structures such as arrays, linked lists, stacks, queues, hash tables, and trees and algorithms such as brute force, divide and conquer, and recursion. Students will learn to compare the efficiency of these recipes and storage techniques, as well as how and when to use them. This intermediate level course will use a combination of the Python and C languages, reviewing and explaining specific features as needed and also practicing programming in those languages.

A computer (MacOS, Windows, or Linux) onto which Python and related modules and tools may be installed is required.

We'll use a variety of online sources rather than a single textbook; see the resources page.

learning outcomes

Students will

• increase their skill in Python and C coding,
• create numerical simulations and summarize them in graphical form,
• acquire a basic understanding of fundamental data structures including dynamic arrays, linked lists, hash tables, trees, and graphs,
• learn various algorithm design strategies such as divide-and-conquer and brute-force, and
• explore a number of classic specific algorithms such as quicksort and Dijkstra's shortest path.

schedule

This is a preliminary schedule which will likely change as we go along.

 Feb         17       getting started
21   24       analysis, O(), plotting
28   03       data structures 101 : linked lists, stacks, que
Mar    08              ... abstract vs implement, priority queue/heap
14   17         ... also in C ; implement hash table (?)
21   24       sorting
28   31     ... midterm project
Apr         07       recursion & binary search ("divide & conquer)
11   14       graph search : depth, breadth
18   21       graph algorithms : djisktrs etc
25   28       game search & "combinatorial" in skienna ; "brute force"
May    02   05       start final projects
09   12       To be decided
16   19
23


format

The course will consist of

• Twice weekly class meetins
• Weekly reading (from a variety of sources) and coding assignments.
• Two coding projects: an assigned midterm project and final project chosen by each student.
• Regular tutoring and office hours discuss the material, ask questions, and get help in zoom meetings and slack conversations.
• A slack channel where you can ask questions.

As a 4 credit course, you should expect to spend roughly 12 hours of time per week on this course, including class time.

expectations and academic integrity

• First and foremost, you are expected to act as adults in this class, behaving responsibly and fostering a safe and welcoming environment for everyone.
• You will participate in all required activities. More than two absences (excused or unexcused) will jeopardize your standing in the course.
• You will be an active participant and collaborator in group sessions.
• You will submit all assigned work by their due dates. Late work is usually accepted for reduced credit; however, if too much of the work is late or it is extremely late, it may not be accepted.
• You will seek out help promptly if you are struggling or falling behind.
• Work submitted will be your own, with appropriate references to sources and resources used. Academic dishonesty will not be tolerated, and will be passed along to the appropriate administrative or judicial entity.

A note on attribution, code, and the culture of programming...

The "culture" surrounding programming is one that encourages sharing and collaboration. Open-source software, online communities such as StackOverflow, GitHub/Gist, and the fast-paced nature of the technology world have all led to a vast collection of places where programmers can quickly and easily get help in solving common and not-so-common problems. This is a fantastic and vital part of being a 'programmer', and I encourage you to use and contribute to these communities.

This being said, there are a few important guidelines that MUST be followed in order to strike a balance between collaboration and academic integrity:

• You must provide attribution for ALL ideas you have consumed from sources outside of your own scope of knowledge. This may be done in a variety of ways, but must be noted explicitly - either via code comments, a note at the time of submission, or via some other mechanism that clearly indicates:
• What part of your work, specifically, has been influenced by an outside source, and how.
• What the outside source was - whether another student, a web site, other code, etc.
• Outside contributions to your work must not comprise a substantial portion of the solution to the problem or module you are working on. Your work must be your own and your Google or interpersonal skills, no matter how sophisticated, do not equate to mastery of course material!
• If you provide assistance to others (in individual projects), or other groups (in group work), you must share this information with the instructor. Helping your fellow students learn is an essential and valuable part of the learning experience. However, providing "too much" help by providing answers or clues that substantially undermine the challenge and learning objectives of an assignment is not helpful and, in fact, a violation of academic integrity. Therefore:
• If you assist another student in class, notify the instructor via email or some other mechanism, indicating who was helped, when, and what the nature of the help was.
• It is also expected (per the 'attribution' paragraph above), that the student who was assisted will also indicate that they were assisted.
• Those helping or being helped should feel secure in the knowledge that the exchange of assistance will not negatively or positively impact their grade on the assignment or work in question.

Here's an example of quoting your sources : a lot of the preceding language in this syllabus is from Andrew Cencini's Fall 2019 edition of this course. ("Hi Andrew!")

The overall course grade will be the average of

• a single homework grade for the semester,
• a midterm project grade, and
• a final project grade.

The homework grade is based on the number of assignments completed and submitted on time.

Project grades will be based on

• how well the project demonstrates your understanding of the material,
• the overall difficulty of the problem,
• the quality and clarity of your code,
• documentation, tests, bibliography, and examples of running it (screenshots, input & output),
• and a written narrative describing what you did, what tools and resources you used.

If circumstances outside of your control - illness, technology issues, your dog ate your homework - get in the way, please do let me know, and we will try to work things out.

questions

Questions about any of this? Ask Jim.