Teaching

CSS 215, Introduction to Algorithms, Fall 2018, SDU.

Course description:

This course is going to introduce the basics of algorithmic approach in solving various problems, and data structures that accompany those algorithms. The course is going to be divided into three parts: theory, data structures and applications. In the first part we are going to learn the process of devising algorithms and analyze their time and space complexity. In doing so, we are going to make use of famous big Oh asymptotic growth notation. In the second part, we are going to learn some basic data structures, or the ways to organize our data. This happens to play an important role when we are going to devise algorithms. In the third part, we are going to learn about hashing and its applications, such as hash tables and Rabin-Karp string search algorithm. In the final weeks of the course, we are going to witness how seemingly unrelated topics we have learned throughout the semester blend beautifully to form a blockchain, the technology which became quite well-known these days. You are going to be asked to create your own blockchain architecture at the end of the course.

Course files: Classroom Files

CSS220, Advanced Algorithms, Summer 2018, SDU.

Course description:

The course is all about algorithms, including their formalisation, analysis, computational complexity and implementation. We are going to learn about the costs of running algorithms, which are usually measured in space/time resources spent to run a particular algorithm. Then we are going to introduce some well-known data structures, such as linked lists and hash tables, and measure the cost of usual operations performed of such data structures. Later, we are going to cover some famous paradigms for algorithms design such as greedy, recursion based and dynamic programming based approaches. This is going to be followed by an introduction to some well-known algorithms for tasks such as sorting, string operations and graph based problems. Finally, we are going to cover some algorithms which operate in continuous domains, such as Linear Programming, Convex Optimisation and Gradient Descent. At the end of the course, the students should be able to perform the following tasks:

  • Analyse space/time complexity of various algorithms;
  • Use common data structures to solve problems, and be able to modify the given data structure to fit the problem at their hands;
  • Select an appropriate algorithmic paradigm to solve desired problems;
  • Be familiar with the algorithms taught in this class, and use them whenever the need arises.
  • Doing their own research on algorithms they are not familiar with, and share their their findings with fellow classmates.

Course files: Classroom Files