This book presents a design thinking approach to problem solving in computing — by first using algorithmic analysis to study the specifications of the problem, before mapping the problem on to data structures, then on to the situatable algorithms. Each technique or strategy is covered in its own chapter supported by numerous examples of problems and their algorithms. The new edition includes a comprehensive chapter on parallel algorithms, and many enhancements.