Chapter 1, *Algorithms and Complexities*, covers how to define an algorithm, measure algorithmic complexity, and identify algorithms with diﬀerent complexities. It also covers how to assess various examples with diﬀerent runtime complexities

Chapter 2, *Sorting Algorithms and Fundamental Data Structures*, explores bubble, quick, and merge sort. We will also introduce data structures and study various implementations and use cases of linked lists, queues, and stacks. We will also see how some data structures can be used as building blocks to build more complex ones.

Chapter 3, *Hash Tables and Binary Search Trees*, talks about data structures for implementing the data dictionary operation. In addition, binary trees also give us the ability to perform various range queries. We will also see examples of both data structures, and implementations of these operations.

Chapter 4, *Algorithm Design Paradigms*, discusses three diﬀerent algorithm design paradigms along with example problems, and discusses how to identify whether problems may be solvable by one of the given paradigms.

Chapter 5, *String Matching Algorithms*, introduces the string matching problem. This chapter also introduces you to the string matching algorithms, starting from the naive search algorithm and improving it by using the rules introduced by Boyer and Moore. We'll also explore some other string matching algorithms without going into too much detail about them.

Chapter 6, *Graphs, Prime Numbers, and Complexity Classes*, introduces graphs, formalizing what they are and showing two different ways to represent them in computer programs. Later, we'll take a look at ways of traversing graphs, using them as building blocks for building more complex algorithms. We'll also look at two diﬀerent algorithms for finding shortest paths in a graph.