These units represent the material covered in the class. The order and the timing may vary according to the dynamics of the class, students and new projects.
Few more topics may be introduced according to the students interests and goals.
Unit 1: Fundamentals: Basic Programming Model Basic Programming Model Java libraries PU libraries Your own libraries What is the purpose of an API? The String class Input and output Redirection and piping Input and output from a file Standard drawing Unit 2: Fundamentals: Data Abstraction Using abstract data types An API for an abstract data type Inherited methods Client code Objects Creating objects Invoking instance methods Using objects Assignment statements Objects as arguments Objects as return values Arrays are objects Arrays of objects Examples of ADTs: Java’s ADTs PU’s ADTs Geometric objects Information processing Strings as ADTs StdIn and StdOut ADTs Implementing an abstract data type Instance variables Constructors Instance methods Scope API, clients, and implementations More ADT implementations Date ADT Maintaining multiple implementations Accumulator API Visual Accumulator API Data-type design Encapsulation Designing API’s Algorithms and abstract data types Interface inheritance Implementation inheritance String conversion Wrapper types Equality Memory management Immutability Design by contract Exceptions and errors Assertions Unit 3: Fundamentals: Bags, Queues, and Stacks Autoboxing Bag ADT FIFO queue ADT Pushdown LIFO stack ADT Arithmetic expression evaluation Implementing collections Generics Array resizing Loitering Iteration Linked lists Building a linked list Insert at the beginning Remove from the beginning Insert at the end Insert/remove at other positions Traversal Stack implementation Queue implementation Bag implementation Unit 4: Fundamentals: Analysis of Algorithms Scientific method Observations Analysis of experimental data Mathematical models Tilde approximations Approximate running time Order-of-growth hypothesis Analysis of algorithms Cost model Order-of-growth classifications Designing faster algorithms Doubling ratio experiments Estimating the feasibility of solving large problems Estimating the value of using a faster computer Caveats Large constants Nondominant inner loop Instruction time System considerations Too close to call Strong dependence on inputs Multiple problem parameters Coping with dependence on inputs Input models Worst-case performance guarantees Randomizing algorithms Sequence of operations Amortized analysis Memory Objects Linked lists Arrays String objects String values and substrings Perspective Unit 5: Fundamentals: Case study: Union-Find Dynamic connectivity Networks Variable-name equivalence Mathematical sets Implementations Quick-find Quick-find analysis Quick-union Forest-of-trees representation Quick-union analysis Weighted quick-union Weighted quick-union analysis Optimal algorithms Amortized cost plots Perspective Unit 6: Sorting: Elementary Sorts Rule of the game Certification Running time Extra memory Types of data Selection sort Running time is insensitive to input Data movement is minimal Insertion sort Visualizing sorting algorithms Comparing two sorting algorithms Shell sort Unit 7: Sorting: Mergesort Abstract in-place merge Top-down mergersort Use insertion sort for small subarrays Test whether the array is already in order Eliminate the copy to the auxiliary array Bottom-up mergesort The complexity of sorting Unit 8: Sorting: Quicksort The basic algorithm Partitioning in place Staying in bounds Preserving randomness Terminating the loop Handling items with keys equal to the partitioning item’s key Terminating the recursion Performance characteristics Algorithmic improvements Cutoff to insertion sort Median-of-three partitioning Entropy-optimal sorting Unit 9: Sorting: Priority Queues API A priority-queue client Elementary implementations Array representation (unordered) Array representation (ordered) Linked-list representations Heap definitions Binary heap representation Algorithms on heaps Bottom-up reheapify (swim) Top-down reheapify (sink) Insert Remove the maximum Multiway heaps Array resizing Inmutability of keys Index priority queue Index priority-queue client Heapsort Heap construction Sortdown Sink to the bottom, then swim Unit 10: Sorting: Applications Sorting various types of data Transaction example Pointer sorting Keys are inmutable Exchanges are inexpensive Alternate orderings Items with multiple keys Priority queues with comparators Stability Which sorting algorithm should I use? Sorting primitive types Java system sort Reductions Duplicates Rankings Priority-queue reductions Median and order statistics A brief survey of sorting applications Commercial computing Search for information Operations research Event-driven simulation Numerical computations Combinatorial search Unit 11: Searching: Symbol Tables Generics Duplicate keys Null keys Null values Deletion Shorthand methods Iteration Key equality Ordered symbol tables Minimum and maximum Floor and ceiling Rank and selection Range queries Exceptional cases Shorthand methods Key equality (revisited) Cost model Sample clients Test client Performance client Sequential search in an unordered linked list Binary search in an ordered array Analysis of binary search Unit 12: Searching: Binary Search Trees Basic implementation Representation Search Insert Recursion Analysis Experiments Order-based methods and deletion Minimum and maximum Floor and ceiling Selection Rank Delete the minimum/maximum Range queries Analysis Unit 13: Searching: Balanced Search Trees 2-3 search trees Search Insert into a tree consisting of a single 3-node Insert into a 3-node whose parent is a 2-node Insert into a 3-node whose parent is a 3-node Splitting the root Global properties Red-black BSTs Encoding 3-nodes An equivalent definition A 1-1 correspondence Color representation Rotations Resetting the link in the parent after a rotation Insert into a single 2-node Insert into a 2-node at the bottom Insert into a tree with two keys (in a 3-node) Flipping colors Keeping the root black Insert into a 3-node at the bottom Passing a red link up the tree Implementation Deletion Top-down 2 3-4 trees Delete the minimum Properties of red-black BSTs Analysis Ordered symbol-table API Unit 14: Searching: Hash Tables Hash functions Typical example Positive integers Floating-point numbers Strings Compound keys Java conventions Converting a hashCode() to an array index User-defined hashCode() Software caching Hashing with separate chaining Table size Deletion Ordered operations Hashing with linear probing Deletion Clustering Analysis of linear probing Array resizing Separate chaining Amortized analysis Memory Unit 15: Searching: Applications Which symbol-table implementation should I use? Primitive types Duplicate keys Java libraries Set APIs Dedup Whitelist and blacklist Dictionary clients Indexing clients Inverted index Sparse vectors Unit 16: Graphs: Undirected Graphs Anomalies Undirected graph data type Representation alternatives Adjacency-lists data structures Design pattern for graph processing Depth-first search Searching in a maze Warmup One-way passages Detailed trace of depth-first search Finding paths Implementation Detailed trace Breadth-first search Connected components Union-find Symbol graphs Degrees of separation Unit 17: Graphs: Directed Graphs Diagraph data type Representation Input format Reversing a diagraph Symbolic names Reachability in diagraphs Single-source reachability Multiple-source reachability Mark-and-sweep garbage collection Finding paths in diagraphs Single-source directed paths Single-sourced shortest directed paths Cycles and DAGs Scheduling problems Precedence-constrained scheduling Topological sort Cycles in diagraphs Directed cycle detection Depth-first orders and topological sort Strong connectivity in diagraphs Strong components Examples of applications Kosaraju’s algorithm Reachability revisited Unit 18: Graphs: Minimum Spanning Trees Minimum spanning tree Underlying principles Cut property Greedy algorithm Edge-weighted graph data type Comparing edges by weight Parallel edges Self-loops MST API and test client Test client Test data Prim’s algorithm Data structures Maintaining the set of crossing edges Unit 19: Graphs: Shortest Paths Properties of shortest paths Shortest-paths tree Edge-weighted diagraph data types Shortest-paths API Data structures for shortest paths Edge relaxation Vertex relaxation Client query methods Theoretical basis for shortest-paths algorithms Optimality conditions Certification Generic algorithm Dijkstra’s algorithm Data structures Variants Source-sink shortest paths All-pairs shortest paths Shortest paths in Euclidean graphs Acyclic edge-weighted digraphs Longest paths Parallel job scheduling Parallel job scheduling with relative deadlines Shortest paths in general edge-weighted digraphs Strawman I Strawman II Negative Cycles Strawman III Queue-based Bellman-Ford Negative weights Negative cycle detection Arbitrage Unit 20: Strings String sorts Key-Indexed Counting LSD String sort MSD String sort Three-way string quicksort Which string-sorting algorithm would you choose? Tries Properties of tries Ternary search tries (TSTs) Properties of TSTs Which string symbol-table implementation should I use? Substring Search Brute-force substring search Knuth-Morris-Pratt substring search Boyer-Moore substring search Rabin-Karp fingerprint search Regular Expressions Describing patterns with regular expressions Shortcuts REs in applications Nondeterministic finite-state automata Simulating an NFA Building an NFA corresponding to an RE Data Compression Rules of the game Limitations Warmup: genomics Run-length encoding Huffman Compression Unit 21: Context Event-driven simulation B-Trees Suffix Arrays Network-flow algorithms Reduction Intractability