[1] While developing software, a programmer must select an appropriate combination of algorithms and data structures that facilitate the delivery of a software solution that addresses the wants and needs of the end user within the constraints of time, cost and available computing power.