There is a more recent offering of this course. This is an archive of the
course which was offered in Spring 2019.
CS2852
Data Structures
Detailed Outcomes
This course covers the organization of data and the algorithms that act
upon them.
## Week 1
### Interfaces
* Use the [`Collection`](http://javadoc.taylorial.com/java.base/util/Collection.html) and [`List`](http://javadoc.taylorial.com/java.base/util/List.html) interfaces defined in the Java Collection Framework
* Explain when to use `Collection` instead of `List` and vice versa
* Demonstrate correct use of generics when declaring `Collection` and `List` interfaces
* Describe the implications of an interface extending another interface
* List two classes that implement the `Collection` interface
* List two classes that implement the `List` interface
### Array Based Lists
* Describe key differences between an array and an [`ArrayList`](http://javadoc.taylorial.com/java.base/util/ArrayList.html) object
* Implement classes and methods that make use of generics
* Write an array-based implementation of the `List` interface, including the following methods:
* [`add(E)`](http://javadoc.taylorial.com/java.base/util/List.html#add%28E%29)
* [`add(int, E)`](http://javadoc.taylorial.com/java.base/util/List.html#add%28int,E%29)
* [`clear()`](http://javadoc.taylorial.com/java.base/util/List.html#clear%28%29)
* [`contains(Object)`](http://javadoc.taylorial.com/java.base/util/List.html#contains%28java.lang.Object%29)
* [`get(int)`](http://javadoc.taylorial.com/java.base/util/List.html#get%28int%29)
* [`indexOf(Object)`](http://javadoc.taylorial.com/java.base/util/List.html#indexOf%28java.lang.Object%29)
* [`isEmpty()`](http://javadoc.taylorial.com/java.base/util/List.html#isEmpty%28%29)
* [`remove(int)`](http://javadoc.taylorial.com/java.base/util/List.html#remove%28int%29)
* [`remove(Object)`](http://javadoc.taylorial.com/java.base/util/List.html#remove%28java.lang.Object%29)
* [`set(int, E)`](http://javadoc.taylorial.com/java.base/util/List.html#set%28int,E%29)
* [`size()`](http://javadoc.taylorial.com/java.base/util/List.html#size%28%29)
* [`toArray()`](http://javadoc.taylorial.com/java.base/util/List.html#toArray%28%29)
* Implement small software systems that use one or more `ArrayList` objects
* Describe key differences between the in class implementation and the [`java.util.ArrayList`](http://javadoc.taylorial.com/java.base/util/ArrayList.html) implementation
* Describe differences in the `java.util.ArrayList` implementation compared to the one created in lecture that affect the asymptotic time complexity of any of the methods
## Week 2
### Big-O Notation and Algorithm Efficiency
* Explain the purpose of Big-O notation
* Describe the limitations of Big-O notation
* Be familiar with the formal definition of Big-O
* Using Big-O notation, determine the asymptotic time complexity of an algorithm with a conditional
* Using Big-O notation, determine the asymptotic time complexity of an algorithm with a loop
* Determine the asymptotic time complexity of an algorithm with a nested loop
* Using Big-O notation, determine the asymptotic time complexity of an algorithm that calls other methods with known asymptotic time complexity
* Use time complexity analysis to choose between two competing algorithms
* Describe the meaning of the following symbols: **T(n)**, **f(n)**, and **O(f(n))**
* Given **T(n)** expressed as a polynomial, determine the Big-O notation
* Determine the asymptotic time complexity of the following methods from the `ArrayList` class: `add(E)`, `add(int, E)`, `clear()`, `contains(Object)`, `get(int)`, `indexOf(Object)`, `isEmpty()`, `remove(int)`, `remove(Object)`, `set(int, E)`, and `size()`
### Linked Lists
* Describe key differences between an array based list and a linked list
* Describe advantages and disadvantages of a singly linked list verses a doubly linked list
* Write an singly linked list implementation of the `List` interface, including the following methods:
* [`add(E)`](http://javadoc.taylorial.com/java.base/util/List.html#add%28E%29)
* [`add(int, E)`](http://javadoc.taylorial.com/java.base/util/List.html#add%28int,E%29)
* [`clear()`](http://javadoc.taylorial.com/java.base/util/List.html#clear%28%29)
* [`contains(Object)`](http://javadoc.taylorial.com/java.base/util/List.html#contains%28java.lang.Object%29)
* [`get(int)`](http://javadoc.taylorial.com/java.base/util/List.html#get%28int%29)
* [`indexOf(Object)`](http://javadoc.taylorial.com/java.base/util/List.html#indexOf%28java.lang.Object%29)
* [`isEmpty()`](http://javadoc.taylorial.com/java.base/util/List.html#isEmpty%28%29)
* [`remove(int)`](http://javadoc.taylorial.com/java.base/util/List.html#remove%28int%29)
* [`remove(Object)`](http://javadoc.taylorial.com/java.base/util/List.html#remove%28java.lang.Object%29)
* [`set(int, E)`](http://javadoc.taylorial.com/java.base/util/List.html#set%28int,E%29)
* [`size()`](http://javadoc.taylorial.com/java.base/util/List.html#size%28%29)
* [`toArray()`](http://javadoc.taylorial.com/java.base/util/List.html#toArray%28%29)
* Describe key differences between a singly linked list and the [`LinkedList`](http://javadoc.taylorial.com/java.base/util/LinkedList.html) class
* Determine the asymptotic time complexity of the following methods from a singly linked list class developed in lecture: `add(E)`, `add(int, E)`, `clear()`, `contains(Object)`, `get(int)`, `indexOf(Object)`, `isEmpty()`, `remove(int)`, `remove(Object)`, `set(int, E)`, and `size()`
* Describe differences in the JCF `LinkedList` implementation compared to the one created in lecture that affect the asymptotic time complexity of any of the methods
* Implement small software systems that use one or more `LinkedList` objects
## Week 3
### Iterators
* List the methods declared in the [`Iterator`](http://javadoc.taylorial.com/java.base/util/Iterator.html) interface
* List the methods declared in the [`Iterable`](http://javadoc.taylorial.com/java.base/lang/Iterable.html) interface
* Implement the [`iterator()`](http://javadoc.taylorial.com/java.base/util/List.html#iterator%28%29) method in the `ArrayList` class (returning a fully functional iterator)
* Implement the [`iterator()`](http://javadoc.taylorial.com/java.base/util/List.html#iterator%28%29) method in the `LinkedList` class (returning a fully functional iterator)
* Explain why the enhanced for loop only works on classes that implement the `Iterable` interface
* Be familiar with the [`ListIterator`](http://javadoc.taylorial.com/java.base/util/ListIterator.html) interface
### Java Collection Framework and Testing
* Explain the purpose of the Java Collections Framework
* Be familiar with class/interface hierarchy for the Java Collections Framework
* Describe the following levels of testing: unit, integration, system, and acceptance
* Describe the differences between black-box testing and white-box testing
* List advantages and disadvantages of black-box testing verses white-box testing
* Develop tests that test boundary conditions
## Week 4
### Stacks
* Enumerate and explain the methods that are part of a **pure stack** interface
* Define LIFO and explain how it relates to a stack
* Explain how the [`Stack`](http://javadoc.taylorial.com/java.base/util/Stack.html) class is implemented in the Java Collection Framework
* Describe the design flaw found in the `Stack` implementation found in the Java Collection Framework
* Implement a class that provides an efficient implementation of the pure stack interface using an `ArrayList`
* Implement a class that provides an efficient implementation of the pure stack interface using a `LinkedList`
* Define the term **adaptor class** and be able to implement a simple adaptor class, e.g., stack, queue
* Implement small software systems that use one or more stack data structures
* List at least two examples of when it makes sense to use a `Stack`
## Week 5
### Queues
* Enumerate and explain the methods that are part of a **pure queue** interface
* Define FIFO and explain how it relates to a queue
* The [`Queue`](http://javadoc.taylorial.com/java.base/util/Queue.html) interface has multiple methods for insertion, removal, and accessing the front element. Describe how these methods differ.
* Describe the design flaw found in the `Queue` interface found in the Java Collection Framework
* Implement a class that provides an efficient implementation of the pure queue interface using a `LinkedList`
* Explain why an `ArrayList` is not an appropriate choice when implementing a pure queue interface
* Explain how a circular queue differs from a standard queue
* Implement a class that provides an efficient implementation of a circular queue using an array
* Implement small software systems that use one or more queue data structures
* List at least two examples of when it makes sense to use a `Queue`
### Recursion
* For a given input, determine how many times a recursive method will call itself
* Explain the role of the base case and recursive step in recursive algorithms
* Use recursion to traverse a list
* Use recursion to search a sorted array
* Understand and apply recursion in algorithm development
## Week 6
### Binary Trees
* Use the following terms to describe nodes in a tree: root, children, parent, sibling, leaf, ancestor, descendent
* Recognize empty trees and contents after any branch to be trees themselves, specifically subtrees
* Define node level recursively, starting with level 1 at the root. Define height as the maximum node level
* Define binary tree (contrasted with a general tree) and explain the use of common types of binary trees: expression trees, Huffman trees, binary search trees
* Explain the criteria for binary trees that are full, perfect, and complete
* Explain preorder, inorder, and postorder traversal of trees using words and figures
* Explain the significance of each of these orders when applied to expression trees
### Binary Tree Implementation
* Develop a `BinaryTree` class with no-arg, one-arg (root node) and 3-arg (root node as well as left and right subtrees) constructors
* Implement `BinaryTree` methods: get{Left,Right}Subtree, isLeaf, and preOrderTraverse/toString methods
## Week 7
### Binary Search Trees
* Define the ordered relationship between parent and child nodes
* Implement a recursive `contains()` method
* Implement a recursive `size()` method
* Implement a recursive `height()` method
* Describe how elements are added to a binary search tree
* Describe how elements are removed from a binary search tree
## Week 8
### Sets and Maps
* Use the [`Set`](http://javadoc.taylorial.com/java.base/util/Set.html) and [`Map`](http://javadoc.taylorial.com/java.base/util/Map.html) interfaces defined in the Java Collection Framework
* Choose the appropriate interface to use from the following choices: `Collection`, `List`, `Set`, and `Map`
* List two classes that implement the `Map` interface
* Interpret and write Java code using the `TreeMap` and `TreeSet` classes
* State and explain the asymptotic time complexity of the following methods from a `TreeSet`: `add(E)`, `clear()`, `contains(Object)`, `isEmpty()`, `remove(Object)`, and `size()`
### Hash Tables
* Describe how elements are added to a hash table
* Describe how elements are removed from a hash table
* Explain the **capacity** of a hash table and how it is used
* Define the **load factor** of a hash table and explain how it is used
* Define a **collision** as it relates to hash tables and describe ways of coping with collisions
* Describe the **open addressing** method for dealing with collisions within a hash table
* Describe the **chaining** method for dealing with collisions within a hash table
* Write a hash table implementation (using chaining) that includes the following methods:
* [`add(E)`](http://javadoc.taylorial.com/java.base/util/Set.html#add%28E%29)
* [`clear()`](http://javadoc.taylorial.com/java.base/util/Set.html#clear%28%29)
* [`contains(Object)`](http://javadoc.taylorial.com/java.base/util/Set.html#contains%28java.lang.Object%29)
* [`isEmpty()`](http://javadoc.taylorial.com/java.base/util/Set.html#isEmpty%28%29)
* [`remove(Object)`](http://javadoc.taylorial.com/java.base/util/Set.html#remove%28java.lang.Object%29)
* [`size()`](http://javadoc.taylorial.com/java.base/util/Set.html#size%28%29)
* Explain why the `Object.hashCode()` method must be overridden if the `Object.equals()` method is overridden
* Describe the criteria for a good `hashCode()` implementation
* Interpret and develop simple hashing functions
* Interpret and write Java code using the `HashMap` and `HashSet` classes
* State and explain the asymptotic time complexity of the following methods from a `HashSet`: `add(E)`, `clear()`, `contains(Object)`, `isEmpty()`, `remove(Object)`, and `size()`
## Week 9
### Balanced Trees
* Describe the impact that balance has on the performance of binary search trees
* Implement the `leftRotate()` and `rightRotate()` methods for a binary tree
* Explain the mechanism used in AVL trees to ensure that they remain balanced
* Illustrate the steps required to balance an AVL tree upon insertion of an additional element
### Deep verses Shallow Copies
* Distinguish between copying a reference and copying an object
* Demonstrate proper use of `==` and `.equals()`
* Describe approaches to making deep copies, e.g., `clone()` and copy constructors