This chapter discusses the fundamentals of analyzing algorithm efficiency. It covers measuring an algorithm's input size, units for measuring running time such as counting basic operations, orders of growth for analyzing efficiency as input size increases, and analyzing worst-case, best-case, and average-case running times. The goal is to determine an algorithm's time and space complexity based on how its running time and memory usage grow relative to the input size.