Williams CollegeWebsiteAcademic Catalog
Computer ScienceDepartment Website
BA Degree in Computer Sciencesource 1source 2source 3
CS Courses
- Introduction to Computer ScienceCSCI 134 (1)introCSCI 134: Introduction to Computer Science
This course introduces students to the science of computation by exploring the representation and manipulation of data and algorithms. We organize and transform information in order to solve problems using algorithms written in a modern object-oriented language. Topics include organization of data using objects and classes, and the description of processes using conditional control, iteration, methods and classes. We also begin the study of abstraction, self-reference, reuse, and performance analysis. While the choice of programming language and application area will vary in different offerings, the skills students develop will transfer equally well to more advanced study in many areas. In particular, this course is designed to provide the programming skills needed for further study in computer science and is expected to satisfy introductory programming requirements in other departments.
- Data Structures and Advanced ProgrammingCSCI 136 (1)introCSCI 136: Data Structures and Advanced Programming
This course builds on the programming skills acquired in Computer Science 134. It couples work on program design, analysis, and verification with an introduction to the study of data structures. Data structures capture common ways in which to store and manipulate data, and they are important in the construction of sophisticated computer programs. Students are introduced to some of the most important and frequently used data structures: lists, stacks, queues, trees, hash tables, graphs, and files. Students will be expected to write several programs, ranging from very short programs to more elaborate systems. Emphasis will be placed on the development of clear, modular programs that are easy to read, debug, verify, analyze, and modify.
- Computer OrganizationCSCI 237 (1)sysCSCI 237: Computer Organization
This course studies the basic instruction set architecture and organization of a modern computer. It provides a programmer's view of how computer systems execute programs, store information, and communicate. Over the semester the student learns the fundamentals of translating higher level languages into assembly language, and the interpretation of machine languages by hardware. At the same time, a model of computer hardware organization is developed from the gate level upward.
- Algorithm Design and AnalysisCSCI 256 (1)algsCSCI 256: Algorithm Design and Analysis
This course investigates methods for designing efficient and reliable algorithms. By carefully analyzing the structure of a problem within a mathematical framework, it is often possible to dramatically decrease the computational resources needed to find a solution. In addition, analysis provides a method for verifying the correctness of an algorithm and accurately estimating its running time and space requirements. We will study several algorithm design strategies that build on data structures and programming techniques introduced in Computer Science 136. These include greedy, divide-and-conquer, dynamic programming, and network flow algorithms. Additional topics of study include algorithms on graphs and strategies for handling potentially intractable problems.
- Principles of Programming LanguagesorCSCI 334 (1)plsCSCI 334: Principles of Programming Languages
This course examines the concepts and structures governing the design and implementation of programming languages. It presents an introduction to the concepts behind compilers and run-time representations of programming languages; features of programming languages supporting abstraction and polymorphism; and the procedural, functional, object-oriented, and concurrent programming paradigms. Programs will be required in languages illustrating each of these paradigms.
Theory of ComputationCSCI 361 (1)theoryCSCI 361: Theory of ComputationThis course introduces a formal framework for investigating both the computability and complexity of problems. We study several models of computation including finite automata, regular languages, context-free grammars, and Turing machines. These models provide a mathematical basis for the study of computability theory--the examination of what problems can be solved and what problems cannot be solved--and the study of complexity theory--the examination of how efficiently problems can be solved. Topics include the halting problem and the P versus NP problem.
- 3 × CS Electiveor2 × CS Elective2 × Math Elective
- Attend 20 CS Colloquia talks
Math/Stat Courses
- Discrete MathematicsorMATH 200 (1)mathMATH 200: Discrete Mathematics
In contrast to calculus, which is the study of continuous processes, this course examines the structure and properties of finite sets. Topics to be covered include mathematical logic, elementary number theory, mathematical induction, set theory, functions, relations, elementary combinatorics and probability, and graphs. Emphasis will be given on the methods and styles of mathematical proofs, in order to prepare the students for more advanced math courses.
CombinatoricsorMATH 328 (1)mathMATH 328: CombinatoricsCombinatorics is a branch of mathematics that focuses on enumerating, examining, and investigating the existence of discrete mathematical structures with certain properties. This course provides an introduction to the fundamental structures and techniques in combinatorics including enumerative methods, generating functions, partition theory, the principle of inclusion and exclusion, and partially ordered sets.
Graph TheoryorMATH 334 (1)mathMATH 334: Graph TheoryA graph is a collection of vertices, joined together by edges. In this course, we will study the sorts of structures that can be encoded in graphs, along with the properties of those graphs. We'll learn about such classes of graphs as multi-partite, planar, and perfect graphs, and will see applications to such optimization problems as minimum colorings of graphs, maximum matchings in graphs, and network flows.
ProbabilityMATH 341 (1)mathMATH 341: ProbabilityThe historical roots of probability lie in the study of games of chance. Modern probability, however, is a mathematical discipline that has wide applications in a myriad of other mathematical and physical sciences. Drawing on classical gaming examples for motivation, this course will present axiomatic and mathematical aspects of probability. Included will be discussions of random variables (both discrete and continuous), distribution and expectation, independence, laws of large numbers, and the well-known Central Limit Theorem. Many interesting and important applications will also be presented, including some from classical Poisson processes, random walks and Markov Chains.
- Mathematics or Statistics Elective (200+)
Other Courses
- 13 × Free Elective
Learning Goals
Our goal is to provide majors with the following abilities:
- To clearly articulate the core concepts of computing and to successfully apply those concepts using modern theoretical and programming tools.
- To precisely define, represent, and algorithmically solve problems both from within computing and also from myriad domains across the arts and sciences.
- To develop precise formal models of computer systems, to reason about them mathematically, to manifest them in computing hardware and software, and to experimentally validate them via the scientific method.
- To develop design and abstraction principles suitable for tackling problems large and small.
- To clearly communicate complex ideas orally, in writing, and in collaboration with others.
History of the Major
2024 | Require one of 334 (Principles of Programming Languages) or 361 (Theory of Computation), instead of both. Require a third CS elective. Add alternatives to MATH 200 (Discrete Mathematics). |
2023 | |
2022 | |
2021 | |
2020 | |
2019 | |
2018 |