- W1 OOP & Abstract Data Structures
- W2 Hashing & Algorithm Analisys
- W3 Trees
- W4 Sorting Algorithms
- W5 Graphs and Graph Traversal
- W6 Tries, String Algorithms & Algorithmic Methods
W1 OOP & Abstract Data Structures
Readings: W1 Readings
Object Oriented Programming Principles (related to ADT’s):
- Understand the principles of ==Encapsulation, inheritance, and polymorphism== in object-oriented programming and how they can be used to create abstract data types (ADT’s)
- Be able to design and implement a class that represents an ADT using object-oriented programming principles
- Be able to use interfaces to define the behavior of an ADT and implement it using different classes
- Understand the difference between an ADT and a concrete implementation of that ADT
Lists:
- Understand the concept of a linear data structure and the differences between arrays and linked lists
- Be able to implement a basic singly linked list in Java
- Understand the limitations of array-based lists and linked-lists
- Understand the time and space complexities of basic operations on a singly linked list, such as insert, delete, and search
- Understand the concept of a doubly linked list and the time and space complexities of basic operations on a doubly linked list
Stacks and Queues:
- Understand the concept of a stack and a queue and the differences between them
- Be able to implement a basic stack and a basic queue in Java
- Understand the time and space complexities of basic operations on a stack and a queue, such as push, pop, and peek
- Understand the use cases of stacks and queues in real-world scenarios
Sets:
- Understand the concept of a set and the differences between sets and lists
- Be able to implement a basic set in Java using an array
- Understand the time and space complexities of basic operations on a set, such as insert, delete, and search
- Understand the use cases of sets in real-world scenarios
Recursion:
- Understand the concept of recursion and how it differs from iteration
- Be able to write and trace recursive functions in Java
- Understand the time and space complexities of recursive functions and how to analyse them
- Understand the use cases of recursion in real-world scenarios and be able to identify when a problem can be solved using recursion.
W2 Hashing & Algorithm Analisys
Readings: W2 Readings
Hashing
- Understand the Dictionary ADT, when it is appropriate and its use-cases.
- Understand the basic concepts of hashing and hash tables, including the hash function, collisions, and load factor.
- Be able to explain the advantages and disadvantages of using hash tables over other data structures.
- Be able to implement a basic hash table in Java, including the ability to add, remove, and search for elements.
- Understand the different collision resolution techniques (e.g. chaining, open addressing) and be able to implement them in Java.
- Understand the time and space complexity of hash tables and be able to analyze the performance of a given implementation.
- Understand the trade-offs involved in choosing a hash function and be able to implement a good hash function for a specific use case.
- Be able to implement a hash table in a real-world application.
Algorithm Analysis
- Understand the basic concepts of algorithm analysis, including big-O notation and time complexity.
- Be able to determine the time complexity of a given algorithm using big-O notation and the counting of instructions
- Understand the common complexity classes (e.g. O(1), O(log n), O(n), O(n log n), O(n2), O(2n)) and be able to classify a given algorithm into one of these classes.
- Be able to analyze the time and space complexity of a given algorithm and determine its efficiency.
- Understand the concept of worst-case, average-case and best-case analysis and be able to analyze an algorithm’s time complexity for each case.
- Understand the trade-offs between time and space complexity and be able to determine the optimal solution for a given problem based on the available resources.
W3 Trees
Readings: W3 Readings
Trees
- Understand the concept of a tree data structure and its basic properties such as the root, parent, and children nodes
- Understand the difference between a tree and a graph
- Understand the different types of trees, such as binary trees, binary search trees, balanced binary trees, general trees, and their specific properties and use cases
- Be able to implement a basic binary tree in Java
- Understand the time and space complexities of basic operations on a binary tree, such as insert, delete, and search
- Understand the concept of a binary search tree and its properties, including the relationship between the value of nodes and their position in the tree
- Understand the concept of balanced binary trees and how they can be used to improve the performance of a binary search tree
- Understand the concept of a general tree and its properties, including the relationship between the value of nodes and their position in the tree
- Understand the implementation of trees, such as array-based and pointer-based implementation
- Understand the use cases of trees in real-world scenarios and be able to identify when a problem can be solved using a tree data structure.
W4 Sorting Algorithms
Readings: W4 Readings
- Understand the basic concepts of sorting algorithms, including stability, in-place sorting, and comparison-based sorting.
- Be able to explain the advantages and disadvantages of various sorting algorithms, such as O(n2) algorithms and O(n log n) algorithms.
- Be able to implement common sorting algorithms in Java, such as Bubble sort, insertion sort, selection sort, merge sort, quick sort, and radix sort.
- Understand the time and space complexity of sorting algorithms and be able to analyse the performance of a given implementation.
- Understand the concept of in-place sorting and be able to implement a sorting algorithm.
- Understand the trade-offs between different sorting algorithms and be able to choose the appropriate algorithm for a given problem based on factors such as time complexity, space complexity, and stability.
- Understand the concept of sorting in linear time and be able to implement algorithms such as counting sort, bucket sort, and radix sort.
- Understand the concept of sorting with limited memory and be able to implement external sorting algorithms such as merge sort and multi-way merge sort.
- Understand the use of sorting in various applications, such as in databases and search algorithms.
- Be able to implement a sorting algorithm in a real-world application and explain its performance.
W5 Graphs and Graph Traversal
Readings: W5 Readings
Graph data structure
- Understand the concept of a graph data structure and its basic properties such as vertices, edges, and the relationship between them
- Understand the different types of graphs, such as directed and undirected, weighted and unweighted, and their specific properties and use cases
- Understand the different representations of graphs, such as adjacency matrix and adjacency list, and their time and space complexities
- Be able to implement basic graph operations in Java, such as adding and removing vertices and edges, traversing the graph, and finding the shortest path
Graph traversal algorithms
- Understand the concept of graph traversal algorithms, such as depth-first search and breadth-first search, and their time and space complexities
- Depth-first search
- Breadth-first search
- Understand the concept of shortest path algorithms, such as Dijkstra’s Algorithm, and their time and space complexities
- Understand the use cases of graphs in real-world scenarios, such as networking, routing, and data analysis and be able to identify when a problem can be solved using a graph data structure
Graph theory
- Understand the concept of graph theory and it’s relation to computer science and data structures
W6 Tries, String Algorithms & Algorithmic Methods
Readings: W6 Readings
Tries
- Understand the basic concepts of trees and be able to explain its use in data structures and algorithms.
- Be able to implement a basic trie in Java and understand its time and space complexity.
- Understand the concepts of prefix tries and be able to implement them in Java. Understand their time and space complexity and how they improve over basic tries.
- Understand the compression of tries and how to implement this concept.
- Understand the use of tries in various fields such as natural language processing, computer science and bioinformatics.
- Be able to apply tries to solve real-world problems and explain their performance.
- Understand the basic concepts of Trie data structure and be able to explain the advantages and disadvantages of Trie data structure.
- Be able to implement various Trie operations such as insertion, deletion, search, and traversal in Java
- Understand the time and space complexity of Trie operations and be able to analyse the performance of a given implementation.
- Understand the use of Trie in various fields such as text completion, spell checking, IP routing, and DNA sequence analysis.
String Algorithms
- Understand the basic concepts of pattern matching algorithms and be able to explain the advantages and disadvantages of different pattern matching techniques.
- Be able to implement the brute-force pattern matching algorithm in Java and understand its time and space complexity.
- Understand the concepts of the KMP algorithm and be able to implement it in Java. Understand its time and space complexity and how it improves over the brute force algorithm.
- Understand the concepts of the Boyer-Moore algorithm and be able to implement it in Java. Understand its time and space complexity and how it improves over the KMP algorithm.
- Understand the use of pattern matching algorithms in various fields such as natural language processing, computer science and bioinformatics.
- Be able to apply pattern matching algorithms to solve real-world problems and explain their performance.
- Understand the basic concepts of string matching algorithm and be able to explain the advantages and disadvantages of different string matching techniques.
- Understand the time and space complexity of string matching algorithms and be able to analyse the performance of a given implementation.
Algorithmic Methods
- Understand the basic concepts of greedy algorithms and be able to explain the advantages and disadvantages of using greedy algorithms over other problem-solving techniques.
- Understand the time and space complexity of greedy algorithms and be able to analyse the performance of a given implementation.
- Understand the concept of a greedy choice and be able to identify it in a problem and apply it to solve it.
- Understand the concept of optimal substructure and be able to identify it in a problem and apply it to solve it.
- Understand the concept of greedy versus dynamic programming and be able to choose between them based on the problem statement.
- Be able to implement a greedy algorithm in a real-world application and explain its performance.
- Understand the basic concepts of divide-and-conquer and be able to explain the advantages and disadvantages of using divide-and-conquer over other problem-solving techniques.
- Understand the time and space complexity of divide-and-conquer algorithms and be able to analyze the performance of a given implementation.
- Understand the concept of breaking down a problem into smaller subproblems and be able to apply it to solve a problem.
- Understand the concept of recursion and how it is used in divide-and-conquer algorithms.
- Understand the concept of merge step and be able to implement it in divide-and-conquer algorithms such as merge sort.
- Understand the concept of base case and be able to identify it and implement it in divide-and-conquer algorithms.
- Be able to implement a divide-and-conquer algorithm in a real-world application and explain its performance.
- Understand the basic concepts of dynamic programming and be able to explain the advantages and disadvantages of using dynamic programming over other problem-solving techniques.
- Understand the time and space complexity of dynamic programming algorithms and be able to analyse the performance of a given implementation.
- Understand the concept of overlapping subproblems and be able to identify it in a problem and apply dynamic programming to solve it.
- Understand the concept of optimal substructure and be able to identify it in a problem and apply dynamic programming to solve it.
- Understand the concept of memoization and be able to implement it in dynamic programming algorithms.
- Understand the concept of tabulation and be able to implement it in dynamic programming algorithms
- Understand the use of dynamic programming in various fields such as operations research, computer science, and mathematics.
- Be able to implement a dynamic programming algorithm in a real-world application and explain its performance.