
Designing correct, efficient, and implementable algorithms for realworld problems requires access to two distinct bodies of knowledge:

Techniques:
 Good algorithm designers understand several fundamental algorithm design techniques, including data structures, dynamic programming, depthfirst search, backtracking, and heuristics. Perhaps the single most important design technique is modeling, the art of abstracting a messy realworld application into a clean problem suitable for algorithmic attack.
 Good algorithm designers understand several fundamental algorithm design techniques, including data structures, dynamic programming, depthfirst search, backtracking, and heuristics. Perhaps the single most important design technique is modeling, the art of abstracting a messy realworld application into a clean problem suitable for algorithmic attack.

Resources:
 Good algorithm designers stand on the shoulders of giants. Rather than laboring from scratch to produce a new algorithm for every task, they can figure out what is known about a particular problem. Rather than reimplementing popular algorithms from scratch, they seek existing implementations to serve as a starting point. They are familiar with many classic algorithmic problems, which provide sufficient source material to model most any application.
 Good algorithm designers stand on the shoulders of giants. Rather than laboring from scratch to produce a new algorithm for every task, they can figure out what is known about a particular problem. Rather than reimplementing popular algorithms from scratch, they seek existing implementations to serve as a starting point. They are familiar with many classic algorithmic problems, which provide sufficient source material to model most any application.

 Find resources of book in book website.