The purpose of this course is to provide a practical introduction to data structures and algorithms from the viewpoint of abstract thinking and problem solving. The primary focus is on problem-solving techniques that allow the construction of sophisticated time-efficient programs. 
The course provides knowledge about fundamental algorithms and data structures in computer science. The main objective of this course is to provide students with means to design and reason about algorithms, understand the strengths and weaknesses of known algorithms, and their suitability in particular contexts. The topics covered include data abstraction, generic components, algorithm analysis, recursion, algorithm design, searching, sorting, randomization, simulation, and graphs. In more detail, the contents of the course may be described as follows: 
  • Data structures: Stacks, queues, linked lists, trees, hash tables, priority queues. 
  • Algorithms: Analysis, verification, searching, sorting. 
  • Problem solving techniques: Divide-and-conquer, dynamic programming, backtracking. 
  • Applications: Games, parsing, file compression, simulation, graphs. 
The programming language Java is used in this course.

Computer applications increasingly have access to online data and exchange data with other online applications.  Huge amounts of data are now stored in "the Cloud".  This "web of data" includes data mined from online sources such as social websites. The first goal of this course is to introduce the essentials necessary for designing systems and exploiting the possibilities opened up for sharing data and building information systems and services around the web of data. The second goal is to introduce concepts that turn "data" into "knowledge"; how to attach semantics to data so that applications can process it more meaningfully and intelligently.