This revision of the successful first edition develops and teaches fundamental techniques for obtaining efficient algorithms to solve problems. Updates include important advances in the computational complexity of matrix multiplication and completely new chapters on sorting and searching. Provides a systematic and in-depth study of the computational complexity of a wide range of practical algorithms, both numerical and non-numercal. Considers numerical algorithms in terms of both computational speed and computational accuracy performance. Provides excercises at the end of each chapter, some with answers, to provide examples of concepts.