Computer scientists learn from their own experience: by looking at how others solve problems, and solving them on their own. The use of various methodologies for finding solutions and studying the construction of algorithms helps us to cope with the increasingly complex tasks for which we undertake. Having considered a number of different algorithms, we can start developing a pattern for recognition, so that when a similar problem arises next time, we are better prepared to solve it.

The algorithms are often very different from each other. Consider an example withsqrt, which we used earlier. It is possible that there are many different ways to implement the details of the square root calculation. One algorithm can use many fewer resources for this, another – work to obtain a result ten times longer, and so on. We would like to be able to compare these two solutions. Although they both work, one of them is perhaps “better” than the other. We can assume that it is more efficient or simply faster and takes up less memory. As we study algorithms, we can also study analytical techniques that allow us to compare and contrast solutions based solely on their own characteristics, and not on the characteristics of programs or computers used for implementation.

In the worst case scenario, we may encounter a hard-to-handle problem, which means that you cannot solve it in a reasonable amount of time. It is very important to be able to distinguish between problems that have a solution, do not have one, and those for which a solution exists, but takes too much time or other resources to use it wisely.

A compromise is often needed here, which must be seen and based on which to make a choice. As computer scientists, in addition to our ability to find a solution, we also need to know and understand the techniques for computing it. After all, very often there are many ways to get an answer. Finding a solution and making sure that it is good is the task we are working on again and again.