CS2852
Outcomes
Software Tips and Tricks
IntelliJ
- How to set up the default template
- How to put line numbers: Menu: File-> Settings. Tree: Editor -> General -> Appearance. Checkbox: Show line numbers. (Thanks to Pat & Nate for showing me how to do this.)
- Print & use shortcuts from this handy IntelliJ Reference card
- Using a Jar File that someone else wrote with your code
- To set up IntelliJ to not collapse imports to .*:
- Go to settings, then Editor -> Code Style -> Java, then the tab “imports”.
- Find line “Class count to use import with ‘.*‘“. Set to a high number.
- Creating a Jar File
Week 1
Big-picture: What this class about
- . Have an idea
what data-structures look like (roughly) - . Explain
why data-structures are so important for computer programs.
Interfaces
- . Use the
Collection<E>
andList<E>
interfaces defined in the Java Collection Framework - . Explain when to use
Collection<E>
instead ofList<E>
and vice versa - . Demonstrate correct use of generics when declaring
Collection<E>
andList<E>
interfaces - . Describe the implications of an interface extending another interface
- . List two classes that implement the
Collection<E>
interface - . List two classes that implement the
List<E>
interface
Array Based Lists
- . Describe key differences between an array and an
ArrayList<E>
object - . Implement classes and methods that make use of generics
- . Write an array-based implementation of the
List<E>
interface, including the following methods: - . Implement small software systems that use one or more
ArrayList<E>
objects - . Describe key differences between the in class implementation and the
java.util.ArrayList<E>
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<E>
class:add(E)
,add(int, E)
,clear()
,contains(Object)
,get(int)
,indexOf(Object)
,isEmpty()
,remove(int)
,remove(Object)
,set(int, E)
, andsize()
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<E>
interface, including the following methods: - . Describe key differences between a singly linked list and the
LinkedList<E>
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)
, andsize()
- . 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<E>
objects
Week 3
Iterators
- . List the methods declared in the
Iterator<E>
interface - . List the methods declared in the
Iterable<E>
interface - . Implement the
iterator()
method in theArrayList
class (returning a fully functional iterator) - . Implement the
iterator()
method in theLinkedList
class (returning a fully functional iterator) - . Explain why the enhanced for loop only works on classes that implement the
Iterable<E>
interface - . Be familiar with the
ListIterator<E>
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<E>
class is implemented in the Java Collection Framework - . Describe the design flaw found in the
Stack<E>
implementation found in the Java Collection Framework - . Implement a class that provides an efficient implementation of the pure stack interface using an
ArrayList<E>
- . Implement a class that provides an efficient implementation of the pure stack interface using a
LinkedList<E>
- . 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<E>
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<E>
interface found in the Java Collection Framework - . Implement a class that provides an efficient implementation of the pure queue interface using a
LinkedList<E>
- . Explain why an
ArrayList<E>
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<E>
class with no-arg, one-arg (root node) and 3-arg (root node as well as left and right subtrees) constructors - Implement
BinaryTree<E>
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<E>
andMap<K, V>
interfaces defined in the Java Collection Framework - Choose the appropriate interface to use from the following choices:
Collection<E>
,List<E>
,Set<E>
, andMap<K, V>
- . List two classes that implement the
Map<K, V>
interface - . Interpret and write Java code using the
TreeMap
andTreeSet
classes - . State and explain the asymptotic time complexity of the following methods from a
TreeSet
:add(E)
,clear()
,contains(Object)
,isEmpty()
,remove(Object)
, andsize()
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:
- Explain why the
Object.hashCode()
method must be overridden if theObject.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
andHashSet
classes - State and explain the asymptotic time complexity of the following methods from a
HashSet
:add(E)
,clear()
,contains(Object)
,isEmpty()
,remove(Object)
, andsize()
Week 9
Balanced Trees
- Describe the impact that balance has on the performance of binary search trees
- Implement the
leftRotate()
andrightRotate()
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
Acknowledgements
Original outcomes by Dr. Taylor