This section goes into great detail about defining efficiency and the bounds of a particular algorithm. The sections I read for this assignment (2.1 and 2.2) begin with a very broad definition of efficiency: “An algorithm is efficient if, when implemented, it runs quickly on real input instances.” Moves on to a more narrower definition: “An algorithm is efficient if it achieves qualitatively better worst-case performance, at an analytical level, than brute-force search.” Before settling on the final definition: “An algorithm is efficient if it has a polynomial running time.” The book does a good job of explaining the different types of running time: polynomial, logarithmic, and exponential and provides a good supplement to the material covered in class. Readability: 7/10