This document discusses complexity analysis of algorithms. It defines an algorithm and lists properties like being correct, unambiguous, terminating, and simple. It describes common algorithm design techniques like divide and conquer, dynamic programming, greedy method, and backtracking. It compares divide and conquer with dynamic programming. It discusses algorithm analysis in terms of time and space complexity to predict resource usage and compare algorithms. It introduces asymptotic notations like Big-O notation to describe upper bounds of algorithms as input size increases.