This course provides the basic background of algorithms analysis, design and advanced data structures from the problem-solving perspective, for students in computer science. During this course, students will learn problem solving skills, how to analyze, implement and compare different solutions, and how to apply them in computational problems. The topics that will be covered include: Algorithms analysis (asymptotic notation,summations & recurrence relations), Advanced Data structure ( E.g. Balanced binary search tress, red- black trees), Divide-and-conquer algorithms, Greedy algorithms, Dynamic programming, Graph data structures and algorithms. We will begin with asymptotic notions, summations and recurrence relations. We will have a review on elementary data Structure and then discuss advanced data structure, including, hashing, binary search tress, red-black trees. We will introduce fundamental algorithmic problems such as searching, sorting and selection, matrix multiplication, as well as fundamental optimization and graph problems. We will discuss fundamental algorithmic techniques: divide-and-conquer, dynamic programming and greedy. We will explore solutions to given problems, understanding the principles to solving the problems and illustrating algorithm techniques that applied to other problems.