If you have a quick look on Wikipedia you’ll find out that algorithms are procedures used to solve calculations and to process data.
When I was in university, one of my teacher has defined them like a receipt. Imagine that you have got dozens of ingredients. You have to mix them in order to obtain something that’s really tasty and that can be considered eatable.
From a certain point of view that’s true. Isn’t it? 🙂
One thing that takes a little bit of attention is the fact that the ingredients have to be selected and manipulated following particular procedures otherwise you’ll obtain a food that it something “similar” to what you are expecting.
One week ago, I was reading a problem on Codility that at the beginning was appearing really… really… EASY PEASY!
That’s the greatest mistake that you can do! It doesn’t exist a problem that is simple… otherwise it’s not a problem 😉
After that assumption, I tried on my favorite editor to solve the problem and it “was failing some tests” (if it doesn’t cover any case it’s wrong).
I misunderstood the fact that my solution wasn’t considering entirely the input.
Hence I decided to focus on the velocity of the execution because maybe some loops + if statements were speed down the execution.
That’s another problem: don’t focus on velocity at the beginning. You’ll incur in a lot of mistakes and the problem will become more complex than expected.
At that point I decided to drink a huge cup of strong Italian coffee. “What am I doing?!?!? That’s not the way!”
This was not the idea that solves all your problems but a kind of ray that was saying me that I should start to think instead of trying a feasible solution .
At the end that’s the result:
Detected time complexity: O(N * M * log(M) + N * log(N))
Score: 100 of 100
…getting back to my teacher’s words, when you are sure that your solution works, you should start to think “Can I do something more?“.
Most of the time the solution is YES! OF COURSE!
Leaving that’s long and boring introduction I think that algorithms are not only a way to solve problems but a tool that allows us, not only geeks or nerds, to find other possible better solutions or to confirm that our one is the best one.
So, if you have a look at the icon, that is taken by the Princeton website, you should consider the opportunity to think a problem as something that has to be solved through organized iterations not only as an intuition.